작성
·
2.9K
·
수정됨
4
안녕하세요 이렇게 좋은 Spring Security에 애를 많이 먹던 도중 늦게나마 열심히 듣고 있는 사람입니다.
강의를 들으면서 Spring Security 6.0 이상 버전으로 혼자 마이그레이션 해보며 공부를 진행하는데요..
다른 분들은 모르겠지만 저는 6.0 이상 버전에서의 다중 보안 설정에서 애를 좀 먹어서.. 혹시나 저 같으신 분들이 있으실까봐 글을 남깁니다..!
다름이 아니라 Spring Security 6.0 이상 버전에서는 먼저
오버라이드해서 함수를 구현하는 것이 아니라 컴포넌트화 시켜서 진행합니다. 또한 HttpSecurity 안의 내용을 구현하는데 변경점이 있다는 것이 가장 큰 차이점인 것 같습니다.
예를 들어 UserSecurityConfig, AdminSecurityConfig를 만들어서 각 경우에 따라 다른 설정을 적용하고 싶은 경우에 두 가지의 config 파일을 만들 수 있다고 가정하면.. 저의 경우에는 AdminSecurityConfig에서 지정한 부분이 권한 정보에 따라 접근이 막히지 않고 다 접근이 가능한 ("/admin/pay"를 user가 접근 가능) 상황이었습니다. 뭐가 문제인지 한참을 찾던 도중
https://docs.spring.io/spring-security/reference/servlet/configuration/java.html
공식 문서를 통해 답을 찾았습니다.
간략하게 해결법부터 말씀드리자면 path로 접근 제한을 하는 경우에 http.securityMatcher()를 사용해야 한다는 점 입니다.
이렇게 하면 아주 잘 구분이 되더군요..!
혹시나 저처럼 하시는 분이 계실까봐 남깁니다..!
@Bean
@Order(0)
public SecurityFilterChain adminFilterChain(HttpSecurity http) throws Exception{
http
.securityMatcher("/admin/pay")
.authorizeHttpRequests(request ->
request.anyRequest().hasRole("ADMIN"));
return http.build();
}
@Bean
@Order(1)
public SecurityFilterChain systemFilterChain(HttpSecurity http) throws Exception{
http
.securityMatcher("/admin/**")
.authorizeHttpRequests(request -> request
.anyRequest().hasAnyRole("SYS", "ADMIN"));
return http.build();
}
@Bean
@Order(2)
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception{
http
.authorizeHttpRequests(request -> request
.requestMatchers(antMatcher("/user/**")).hasRole("USER")
.anyRequest().authenticated());
답변 3
0
0
0
안녕하세요 jwl5015 님, 인프런 AI 인턴이에요. Spring Security 6.0 이상 버전에서의 다중 보안 설정에 대한 질문입니다, 맞나요?
Spring Security 6.0 이상 버전에서는 이전 버전과는 조금 다른 방식으로 다중 보안 설정을 구현할 수 있습니다. 예를 들어, UserSecurityConfig와 AdminSecurityConfig라는 두 개의 설정 파일을 만들어서 각각의 경우에 따라 다른 설정을 적용하고 싶다면, 아래와 같이 설정할 수 있습니다.
@Bean
@Order(0)
public SecurityFilterChain adminFilterChain(HttpSecurity http) throws Exception {
http
.requestMatcher(new AntPathRequestMatcher("/admin/pay"))
.authorizeRequests(authorize -> authorize
.anyRequest().hasRole("ADMIN")
);
return http.build();
}
@Bean
@Order(1)
public SecurityFilterChain systemFilterChain(HttpSecurity http) throws Exception {
http
.requestMatcher(new AntPathRequestMatcher("/admin/**"))
.authorizeRequests(authorize -> authorize
.anyRequest().hasAnyRole("SYS", "ADMIN")
);
return http.build();
}
@Bean
@Order(2)
public SecurityFilterChain defaultFilterChain(HttpSecurity http) throws Exception {
http
.authorizeRequests(authorize -> authorize
.requestMatchers(new AntPathRequestMatcher("/user/**")).hasRole("USER")
.anyRequest().authenticated()
);
return http.build();
}
이렇게 설정하면, “/admin/pay” 경로에 대한 접근은 “ADMIN” 권한이 있는 경우에만 가능하고, “/admin/” 경로에 대한 접근은 “SYS”나 “ADMIN” 권한이 있는 경우에만 가능하며, “/user/” 경로에 대한 접근은 “USER” 권한이 있는 경우에만 가능합니다.
이 방식으로 Spring Security 6.0 이상에서 다중 보안 설정을 구현하실 수 있습니다. 추가로 궁금한 점이 있으시면 언제든지 물어보세요!