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");
    }

}