⏰ 2024. 06. 17 월
✔ 스프링 이론 강의를 듣고 정리하면서 작성했습니다.
접근 불가 페이지 만들기 - API 접근 권한 제어 이해
ROLE_
로 시작해야 한다.ROLE_ADMIN
ROLE_USE
public enum UserRoleEnum {
USER(Authority.USER), // 사용자 권한
ADMIN(Authority.ADMIN); // 관리자 권한
private final String authority;
UserRoleEnum(String authority) {
this.authority = authority;
}
public String getAuthority() {
return this.authority;
}
public static class Authority {
public static final String USER = "ROLE_USER";
public static final String ADMIN = "ROLE_ADMIN";
}
}
public class UserDetailsImpl implements UserDetails {
// ...
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
SimpleGrantedAuthority adminAuthority = new SimpleGrantedAuthority("ROLE_ADMIN");
Collection<GrantedAuthority> authorities = new ArrayList<>();
authorities.add(adminAuthority);
return authorities;
}
}
new SimpleGrantedAuthority("ROLE_ADMIN")
을 보면 위 예시 코드는 권한이 ROLE_ADMIN
으로 고정되어 있지만, 실제 코드에서는 사용자에 정의되어 있는 role의 authority 값을 사용하여 동적으로 저장된다. UserRoleEnum role = user.getRole();
String authority = role.getAuthority();
SimpleGrantedAuthority simpleGrantedAuthority = new SimpleGrantedAuthority(authority);
authority
값을 사용하여 간편하게 권한을 제어할 수 있다.@Secured
애너테이션으로 권한 설정이 가능하다.@Secured("권한 이름")
선언하고, 권한을 1개 이상 설정 가능하다.@Secured(UserRoleEnum.Authority.ADMIN) // 관리자용
@GetMapping("/products/secured")
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:/";
}
@Secured
애너테이션 활성화 방법
SecurityConfig
클래스에 @EnableGlobalMethodSecurity(securedEnabled = true)
을 설정하여 활성화 할 수 있다.
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true) // @Secured 애너테이션 활성화
public class WebSecurityConfig {
...
}