반응형
최근 스프링 시큐리티를 공부하면서 다중 HttpSecurity 구성을 해보게 되었다.
그런데 디버깅 결과 하나의 SecurityFilterChain
구성 - 2만 동작하고 SecurityFilterChain
구성 - 1의 필터가 제대로 등록 되지 않았다. 한 쪽만 동작하고 있었던 것이다. 순서도 지정해 주었는데…
SecurityFilterChain
구성 - 1
@Bean
@Order(0)
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.securityMatcher("/api/**")
.authorizeHttpRequests(auth -> auth.anyRequest()
.authenticated()
).csrf(csrf -> csrf.disable());
http.addFilterBefore(ajaxAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
...
}
SecurityFilterChain
구성 - 2
@Bean
@Order(1)
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.authorizeHttpRequests(auth -> auth
.requestMatchers("/", "/users", "/login*").permitAll() // login* : customAuthenticationFailureHandler의 경로 허용을 위한 처리
.requestMatchers("/mypage").hasRole("USER")
.requestMatchers("/messages").hasRole("MANAGER")
.requestMatchers("/config").hasRole("ADMIN")
.anyRequest().authenticated()
)
.exceptionHandling(httpSecurityExceptionHandlingConfigurer -> httpSecurityExceptionHandlingConfigurer.accessDeniedHandler(customAccessDeniedHandler())) //접근거부시 사용되는 핸들러 등록
.formLogin(formLoginConfigurer -> formLoginConfigurer
.loginPage("/login")
.loginProcessingUrl("/login_proc")
.defaultSuccessUrl("/")
.failureUrl("/login")
.authenticationDetailsSource(customAuthenticationDetailsSource()) // 인증 객체에 사용자 추가 요청 정보를 저장
.successHandler(customAuthenticationSuccessHandler()) //인증에 성공한 이후에 호출되어 동작
.failureHandler(customAuthenticationFailureHandler()) //인증에 실패한 경우 호출되어 동작
.permitAll()
)
.csrf(httpSecurityCsrfConfigurer -> httpSecurityCsrfConfigurer.disable());
...
}
스프링에서 빈은 메서드 이름으로 자동으로 등록 되는 것이 생각나서 혹시나 싶어 아래와 같이 메서드의 이름을 변경해보니 모든 설정이 정상 동작한다…
SecurityFilterChain
구성 - 1(변경)
@Bean
@Order(0)
public SecurityFilterChain ajaxFilterChain(HttpSecurity http) throws Exception {
...
}
SecurityFilterChain
구성 - 2
@Bean
@Order(1)
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
...
}
이런 상황이 난감한 것은 서버는 정상적으로 동작하는 것 처럼 보인다는 것이다.
사소한 실수가 큰 스노우볼이 될 수 있다는 사실을 잊지 않아야겠다.
반응형