Blog

[Spring]43 Spring Security - @Secured 를 통한 유저 구분에 따른 접근 가능 페이지, 또는 그 외 요청 제한하기

Author
Summary
유저 유형에 따른 접근 제한 설정법, 접근 제한페이지 안내 기능을 넣어보자.
Category
Study
Tags
Spring
Favorite
Memory Date
2023/09/08
Cross Reference Study
Related Media
Related Thought
Related Lessons
tag
날짜
작성자
진행상황
진행 전
태그구분
6 more properties
💡
유저의 역할 구분에 따라(관리자/일반회원/등등) 접근 가능한 페이지를 구분하는 방법
Controller의 요청메소드에서 Security의 @Secure 어노테이션을 통해서 회원의 역할이나 회원의 구분을 위해 만든 타입에 대하여 특정 페이지들의 접근을 허용 또는 비허용 할 수 있다.
특히 관리자 페이지는 관리자 역할의 회원만이 로그인한 상태에서 접근해야 되는 점이 중요하고, 그 외에도 회원들은 준회원, 정회원 등으로 등급별 접근 가능 경로를 세부적으로 나눠야 할 수 있기 때문에 이 기능을 잘 활용해야 한다.
💡
접근 요청 메소드에 @Secured 어노테이션 추가
아래와 같이 접근에 대한 제한을 걸어 둘 필요가있는 요청의 메소드에 어노테이션을 추가한다.
@Secured(UserRoleEnum.Authority.ADMIN) // <- 관리자 전용 접근가능 페이지 설정방법 @GetMapping("/products/secured") // http://localhost:8080/api/products/secured -> 관리자 (ROLE이 ADMIN아니면 접속이 불가능하다.) public String getProductsByAdmin(@AuthenticationPrincipal UserDetailsImpl userDetails) { System.out.println("userDetails.getUsername() = " + userDetails.getUsername()); for (GrantedAuthority authority : userDetails.getAuthorities()) { System.out.println("authority.getAuthority() = " + authority.getAuthority()); } return "redirect:/"; }
Java
복사
이와 같이 설정하면 로그인된 회원의 인증 정보로부터 사용자 구분을 위해 role이라는 것으로 구분했던 값을 읽어오며, 곧 해당 경로는 로그인된 회원의 role 값ADMIN인 경우에만 해당 메소드를 실행하게 된다.
💡
WebSecurityConfig.java에서 위 기능을 활성화 시키기
요청 메소드에서 구성한 이후에 해당 어노테이션이 작동하게끔 하려면 해당 프로젝트의 SecurityConfig를 다루고 있는 WebSecurityConfig.java 에서 클래스에 @EnableGlobalMethodSecurity(securedEnabled = true) 를 추가하면서 컨트롤러의 어노테이션이 활성화되게 된다.
💡
접근 불가 페이지 forbidden.html로 안내하기
해당 URL 요청 또는 페이지 접근 권한이 없는 유저가 진입하려 시도하면 그에 따른 반응을 보여주어야 한다. 보통 forbidden과 같은 잘못된 접근에 대한 경고문 등이 포함된 웹 페이지를 반환하여 잘못된 경로라는 것을 인지시켜 주게 된다.
하단의 exceptionHandling을 통해 접근 실패 시 accessDeniedPage(”보여줄페이지경로”)를 통해서 작성한 페이지로 redirect 시킬 수 있다.
WebSecurityConfig.java에서 접근 권한 및 접근 불가페이지 안내를 작성한 예시 코드는 다음과 같다.
@Configuration @EnableWebSecurity // Spring Security 지원을 가능하게 함 @EnableGlobalMethodSecurity(securedEnabled = true) // @Secured 애너테이션 활성화 (./controller/ProductController.java) public class WebSecurityConfig { private final JwtUtil jwtUtil; private final UserDetailsServiceImpl userDetailsService; private final AuthenticationConfiguration authenticationConfiguration; ... http.addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class); ... // 접근 불가 페이지 http.exceptionHandling((exceptionHandling) -> exceptionHandling .accessDeniedPage("/forbidden.html") ); return http.build(); } }
Java
복사