728x90
반응형
Spring Security에 "권한(Authority)" 설정 방법
회원 상세정보(UserDetailsImpl) 를 통해 권한 설정 가능. 권한을 1개 이상 설정 가능.
"권한 이름" 규칙 : "ROLE_"로 시작해야 함.
예) "ADMIN" 권한 부여 → "ROLE_ADMIN" "USER" 권한 부여 → "ROLE_USER"
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;
}
}
예시 코드는 ROLE_ADMIN 으로 고정되어 있지만 아래와 같이 실제 코드에서는 사용자에 저장되어 있는 role의 authority 값을 사용하여 동적으로 저장된다.
UserRoleEnum role = user.getRole();
String authority = role.getAuthority();
SimpleGrantedAuthority simpleGrantedAuthority = new SimpleGrantedAuthority(authority);
UserDetailsImpl에 저장된 authorities 값을 사용하여 간편하게 권한을 제어 할 수 있다.
Spring Security를 이용한 API 별 권한 제어 방법
Controller에 @Secured 에너테이션으로 권한 설정 가능.
@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 에너테이션 활성화 방법
@Configuration
@EnableWebSecurity // 스프링 Security 지원을 가능하게 함
@EnableMethodSecurity(securedEnabled = true) // @Secured 애너테이션 활성화
public class WebSecurityConfig {
접근 불가 페이지 URL 설정
WebSecurityConfig
// 접근 불가 페이지
http.exceptionHandling((exceptionHandling) ->
exceptionHandling
// "접근 불가" 페이지 URL 설정
.accessDeniedPage("/forbidden.html")
);
728x90
반응형
'Spring' 카테고리의 다른 글
Spring의 RestTemplate 이해하기 (0) | 2024.08.17 |
---|---|
Spring 데이터 검증 (Validation)하기 (0) | 2024.08.17 |
Spring Security 프레임워크 이해하기 (0) | 2024.08.16 |
Spring의 Filter 이해하기 및 구현하기 (0) | 2024.08.16 |
Spring에서 JWT 이해하기 + 쿠키와 세션 개념까지 (0) | 2024.08.16 |