Java-Security(六):Spring Security啟動加載MySecurityConfig(WebSecurityConfigurerAdapter)/WebSecurity/HttpSecurity(xxxConfigurer、filters)流程


本章文件分為三個部分:

1)在進行Spring Security加載流程分析之前,我們需要先了解下WebSecurityConfigurerAdapter;

2)SpringBoot如何啟動SpringSecurity?

3)Spring Security啟動流程:MySecurityConfig(WebSecurityConfigurerAdapter)/WebSecurity/HttpSecurity(xxxConfigurer、filters)。

了解下WebSecurityConfigurerAdapter

該類是一個Spring Security Web配置適配器。在使用Spring Security項目中,如果想通過配置修改Spring Security中的一些可配置、可自定義替換的相關設置,都必須在項目中添加一個繼承WebSecurityConfigurerAdapter的類MySecurityConfig。

WebSecurityConfigurerAdapter是一個抽象類,一般情況下繼承了該類的配置類MySecurityConfig中可以通過重寫:

1)’configure(HttpSecurity http)‘實現對HttpSecurity配置;

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.csrf().disable();
  
    // 基於token,所以不需要session
    http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);

    http.authorizeRequests()
            .antMatchers("/", "/*.html", "/favicon.ico", "/css/**", "/js/**", "/fonts/**", "/layui/**", "/img/**",
                    "/v2/api-docs/**", "/swagger-resources/**", "/webjars/**", "/pages/**", "/druid/**",
                    "/statics/**")
            .permitAll().anyRequest().authenticated();
    http.formLogin()/*.loginPage("/login.html")*/.loginProcessingUrl("/login")
            .successHandler(authenticationSuccessHandler).failureHandler(authenticationFailureHandler);
            // .and().exceptionHandling().authenticationEntryPoint(authenticationEntryPoint);
    http.logout().logoutUrl("/logout").logoutSuccessHandler(logoutSuccessHandler);
    // 解決不允許顯示在iframe的問題
    http.headers().frameOptions().disable();
    http.headers().cacheControl();

    http.addFilterBefore(tokenFilter, UsernamePasswordAuthenticationFilter.class);
}

2)'configure(WebSecurity web)'實現對WebSecurity配置;

3)’configure(AuthenticationManagerBuilder auth)‘實現對Authentication配置;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder());
    }

實際上,這個WebSecurityConfigurerAdapter就是為了干預HttpSecurity/WebSecurity/AuthenticationManagerBuilder,用來根據使用Spring Security的開發人員可以自己通過配置達到自己想要的功能效果。

SpringBoot如何啟動SpringSecurity?

如果是SpringBoot項目依賴了Spring Security相關依賴,就會自動加載執行SecurityFilterAutoConfiguration配置類,而SecurityFilterAutoConfiguration加載之前會先加載執(@AutoConfigureAfter({SecurityAutoConfiguration.class}))SecurityAutoConfiguration,在SecurityAutoConfiguraiton生效時它會導入WebSecurityEnableConfiguration
EnableWebSecurity主要是加載了三個類:

<1>SpringWebMvcImportSelector的作用是判斷當前的環境是否包含springmvc,因為spring security可以在非spring環境下使用,為了避免DispatcherServlet的重復配置,所以使用了這個注解來區分。
<2> WebSecurityConfiguration顧名思義,是用來配置web安全的,下面的小節會詳細介紹。
<3>AuthenticationConfiguration權限配置相關類
而重點就是后兩者!

Spring Security啟動流程

在項目啟動中,HttpSecurity中會加載一個Configurers,它們就是實現了AbstractInterceptUrlConfigurer的Configurer類,之后會根據xxxConfigurer后#configure(HttpSecurity http)會加載Configurer對應的Filters列表中:

HttpBasicConfigurer->BasicAuthenticationFilter
LogoutConfigurer->LogoutFilter
RequestCacheConfigurer->RequestCacheAwareFilter
RememberMeConfigurer->RememberMeAuthenticationFilter
ServletApiConfigurer->SecurityContextHolderAwareRequestFilter
DefaultLoginPageConfigurer->DefaultLoginPageGeneratingFilter
SessionManagementConfigurer->SessionManagementFilter
PortMapperConfigurer->無
ExceptionHandlingConfigurer->ExceptionTranslationFilter
HeadersConfigurer->HeaderWriterFilter
CsrfConfigurer->CsrfFilter
ImplicitGrantConfigurer->OAuth2AuthorizationRequestRedirectFilter
AnonymousConfigurer->AnonymousAuthenticationFilter
JeeConfigurer->J2eePreAuthenticatedProcessingFilter
ChannelSecurityConfigurer->ChannelProcessingFilter
CorsConfigurer->CorsFilter
SecurityContextConfigurer->SecurityContextPersistenceFilter
FormLoginConfigurer->DefaultLoginPageGeneratingFilter
OAuth2LoginConfigurer->OAuth2LoginAuthenticationFilter
OpenIDLoginConfigurer->OpenIDAuthenticationFilter
X509Configurer->X509AuthenticationFilter
UrlAuthorizationConfigurer->FilterSecurityInterceptor
ExpressionUrlAuthorizationConfigurer->FilterSecurityInterceptor

SecurityConfigurer:

 SecurityBuilder:

HttpSecurity是一個securityBuilder,HttpSecuirty內部維護了一個Filter的List集合,我們添加的各種安全配置器對應的Filter最終都會被加入到這個List集合中。
WebSecurity是一個securityBuilder,內部維護着securityBuilder的列表,存儲securityBuilder,這里主要是存儲HttpSecurity。
很多官方類是XXXConfigurer,這些都是SecurityConfigurer。這些SecurityConfigurer的configure()方法,都會把對應filter添加到HttpSecurity 

 

參考:

基於注解的Spring Security原理解析

Spring Security 實現原理的理解記錄

SpringSecurity分析-1-啟動加載


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM