반응형

 

최근 스프링 시큐리티를 공부하면서 다중 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 {
		...
}

 

이런 상황이 난감한 것은 서버는 정상적으로 동작하는 것 처럼 보인다는 것이다.
사소한 실수가 큰 스노우볼이 될 수 있다는 사실을 잊지 않아야겠다.

 

반응형

+ Recent posts