@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主要是加載了三個類:
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:
WebSecurity是一個securityBuilder,內部維護着securityBuilder的列表,存儲securityBuilder,這里主要是存儲HttpSecurity。
很多官方類是XXXConfigurer,這些都是SecurityConfigurer。這些SecurityConfigurer的configure()方法,都會把對應filter添加到HttpSecurity
參考: