Spring Security ‐ 다중 보안 설정 - dnwls16071/Backend_Summary GitHub Wiki
📚 Spring Security의 다중 보안 설정
- Spring Security는 여러 SecurityFilterChain의 @Bean을 등록해 다중 보안 기능을 구성할 수 있다.
@Configuration
@EnableWebSecurity
public class MultiHttpSecurityConfig {
@Bean
@Order(1) // @Order 를 사용하여 어떤 SecurityFilterChain 을 먼저 수행 할지 지정한다. 아래 설정보다 우선적으로 보안 기능을 수행한다
public SecurityFilterChain apiFilterChain(HttpSecurity http) throws Exception {
http.securityMatcher("/api/**") // HttpSecurity가 /api/로 시작하는 URL 에만 적용 된다
.authorizeHttpRequests(authorize -> authorize
.anyRequest().hasRole("ADMIN"))
.httpBasic(withDefaults());
return http.build();
}
@Bean // @Order 가 지정되지 않으면 마지막으로 간주 된다
public SecurityFilterChain formLoginFilterChain(HttpSecurity http) throws Exception {
http.authorizeHttpRequests(authorize -> authorize.anyRequest().authenticated()) // HttpSecurity 가 /api/ 를 제외한 모든 URL 에 적용 된다
.formLogin(withDefaults());
return http.build();
}
}
📚 Custom DSLs
- Spring Security는 사용자 정의 DSL을 구현할 수 있도록 지원한다.
- DSL을 구성하면 필터, 핸들러, 메서드, 속성을 한 곳에 정의하여 처리할 수 있는 편리함을 제공한다.
[AbstractHttpConfigurer<AbstractHttpConfigurer, HttpSecurityBuilder>]
- 사용자 정의 DSL을 구현하기 위해 상속받는 추상 클래스로서 구현 클래스는 2개의 메서드를 오버라이딩해야한다.
init(B builder) : HttpSecurity 구성 요소를 설정 및 공유하는 작업
configure(B builder) : 공통 클래스를 구성하거나 사용자 정의 필터를 생성하는 작업
[HttpSecurity.with(C configurer, Customizer customizer)]
- configurer는 AbstractHttpConfigurer을 상속하고 DSL을 구현한 클래스가 들어간다.
- customizer는 DSL 구현 클래스에서 정의한 여러 API를 커스터마이징한다.
- 동일한 클래스를 여러 번 설정하더라도 최초 한 번만 적용된다.
public class AdminAuthenticationFilterConfigurer <H extends HttpSecurityBuilder<H>> extends AbstractAuthenticationFilterConfigurer<H, AdminAuthenticationFilterConfigurer<H>, UsernamePasswordAuthenticationFilter> {
public AdminAuthenticationFilterConfigurer(ObjectMapper objectMapper, AuthenticationSuccessHandler authenticationSuccessHandler, AuthenticationFailureHandler authenticationFailureHandler) {
super(new AdminAuthenticationFilter(objectMapper), "/sign-in");
successHandler(authenticationSuccessHandler);
failureHandler(authenticationFailureHandler);
}
@Override
protected RequestMatcher createLoginProcessingUrlMatcher(String loginProcessingUrl) {
return new AntPathRequestMatcher(loginProcessingUrl, "POST");
}
}