유저의 역할 구분에 따라(관리자/일반회원/등등) 접근 가능한 페이지를 구분하는 방법
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
복사