권한 계층 구조 RoleHierarchyImpl(SpringBoot3)
•
SpringBoot 3 기준으로 공식 문서를 보고 작성한다.
•
SecurityConfig 내용은 여타 프로젝트와 다를 거 없다.
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.csrf(csrf -> csrf.disable()) // csrf 보안 토큰 사용 x
.httpBasic(httpBasic -> httpBasic.disable()) // 매 요청마다 id, pwd 보내는 방식 사용 x
.formLogin(formLogin -> formLogin.disable()) // formLogin 사용 x
.sessionManagement(sessionManagement -> sessionManagement
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) // 세션 사용 x
.cors(cors -> cors.configurationSource(corsConfigurationSource()))
.addFilterBefore(jwtAuthorizationFilter(), UsernamePasswordAuthenticationFilter.class)
.addFilterBefore(jwtExceptionFilter(), JwtAuthorizationFilter.class)
.exceptionHandling(exceptionHandling -> exceptionHandling.authenticationEntryPoint(customAuthenticationEntryPoint))
.exceptionHandling(exceptionHandling -> exceptionHandling.accessDeniedHandler(customAccessDeniedHandler))
.authorizeRequests(authorizeRequests -> authorizeRequests.expressionHandler(expressionHandler())) // 추가됨
.authorizeRequests(authorize -> authorize
.requestMatchers("/api/v1/auth/**").permitAll()
.anyRequest().hasRole("TEACHER")
);
return http.build();
}
Java
복사
•
다만 특이한 점은 요 아래 코드가 하나 더 붙는 단 점이다
@Bean
public RoleHierarchyImpl roleHierarchy() {
RoleHierarchyImpl roleHierarchy = new RoleHierarchyImpl();
roleHierarchy.setHierarchy("ROLE_DIRECTOR > ROLE_TEACHER");
return roleHierarchy;
}
@Bean
public DefaultWebSecurityExpressionHandler expressionHandler() {
DefaultWebSecurityExpressionHandler expressionHandler =
new DefaultWebSecurityExpressionHandler();
expressionHandler.setRoleHierarchy(roleHierarchy());
return expressionHandler;
}
Java
복사
•
이 두 메서드를 통해 hasRole("TEACHER")가 hasAnyRole('TEACHER','DIRECTOR') 와 같은 의미가 된다.
분산 트랜잭션, db 잠금 (알아보기만 했다,,,,, 정리는 x)