AutoConfiguration - 자동 설정으로 인해 SecurityBuilder 클래스 만듦
SecurityBuilder (설정 클래스 생성, 초기화 작업 진행)→ SecurityConfigurer 내부 메서드 실행.
ex)
SecurityBuilder 에서 HttpSecurity 설정 클래스 생성 → 빈이 됨.
HttpSecurity객체가 Securityconfigurer 타입의 설정 클래스를 생성. → 엄청 많음
Securityconfigurer 타입의 설정 클래스 인 init()과 configurer() 에서 초기화 작업이 일어남.
이 중에서 필터들을 생성함(CorsFilter, DisableEncodeUrlFilter 등)
각각의 configurer 설정 클래스마다 필터가 있음.
class HttpSecurityConfiguration {
...
//필터 생성.
@Bean({"org.springframework.security.config.annotation.web.configuration.HttpSecurityConfiguration.httpSecurity"})
@Scope("prototype")
HttpSecurity httpSecurity() throws Exception {
LazyPasswordEncoder passwordEncoder = new LazyPasswordEncoder(this.context);
AuthenticationManagerBuilder authenticationBuilder = new DefaultPasswordEncoderAuthenticationManagerBuilder(this.objectPostProcessor, passwordEncoder);
authenticationBuilder.parentAuthenticationManager(this.authenticationManager());
authenticationBuilder.authenticationEventPublisher(this.getAuthenticationEventPublisher());
HttpSecurity http = new HttpSecurity(this.objectPostProcessor, authenticationBuilder, this.createSharedObjects());
WebAsyncManagerIntegrationFilter webAsyncManagerIntegrationFilter = new WebAsyncManagerIntegrationFilter();
webAsyncManagerIntegrationFilter.setSecurityContextHolderStrategy(this.securityContextHolderStrategy);
http.csrf(Customizer.withDefaults()).addFilter(webAsyncManagerIntegrationFilter).exceptionHandling(Customizer.withDefaults()).headers(Customizer.withDefaults()).sessionManagement(Customizer.withDefaults()).securityContext(Customizer.withDefaults()).requestCache(Customizer.withDefaults()).anonymous(Customizer.withDefaults()).servletApi(Customizer.withDefaults()).apply(new DefaultLoginPageConfigurer());
http.logout(Customizer.withDefaults());
this.applyCorsIfAvailable(http);
this.applyDefaultConfigurers(http);
return http;
}
}
AbstractConfiguredSecurityBuilder의 메서드를 통해 build됨.
protected final O doBuild() throws Exception {
synchronized(this.configurers) {
this.buildState = AbstractConfiguredSecurityBuilder.BuildState.INITIALIZING;
this.beforeInit();
this.init(); // Securityconfigurer 타입의 모든 설정 클래스들의 init() 실행
this.buildState = AbstractConfiguredSecurityBuilder.BuildState.CONFIGURING;
this.beforeConfigure();
this.configure(); // Securityconfigurer 타입의 모든 설정 클래스들의 configure() 실행
this.buildState = AbstractConfiguredSecurityBuilder.BuildState.BUILDING;
O result = this.performBuild();
this.buildState = AbstractConfiguredSecurityBuilder.BuildState.BUILT;
return result;
}
}