Spring Security 實戰乾貨:自定義配置類入口WebSecurityConfigurerAdapter

1. 前言

今天咱們要進一步的的學習如何自定義配置 Spring Security 咱們已經屢次提到了 WebSecurityConfigurerAdapter ,並且咱們知道 Spring Boot 中的自動配置其實是經過自動配置包下的 SecurityAutoConfiguration 總配置類上導入的 Spring Boot Web 安全配置類 SpringBootWebSecurityConfiguration 來配置的。因此咱們就拿它開刀。若是仍是一頭霧水建議經過 https://felord.cn 查看 Spring Security 實戰html

2. 自定義 Spring Boot Web 安全配置類

咱們使用咱們最擅長的 Ctrl + CCtrl + V 抄源碼中的 SpringBootWebSecurityConfiguration ,命名爲咱們自定義的 CustomSpringBootWebSecurityConfiguration :java

@Configuration
   @ConditionalOnClass(WebSecurityConfigurerAdapter.class)
   @ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
   public class CustomSpringBootWebSecurityConfiguration {
   
       @Configuration
       @Order(SecurityProperties.BASIC_AUTH_ORDER)
       static class DefaultConfigurerAdapter extends WebSecurityConfigurerAdapter {
           @Override
           protected void configure(AuthenticationManagerBuilder auth) throws Exception {
               super.configure(auth);
           }
   
           @Override
           public void configure(WebSecurity web) throws Exception {
               super.configure(web);
           }
   
           @Override
           protected void configure(HttpSecurity http) throws Exception {
               super.configure(http);
           }
       }
   }複製代碼

相信已經有人注意到了上面 DefaultConfigurerAdapter 中我覆寫(@Override)了三個方法,咱們通常會經過自定義配置這三個方法來自定義咱們的安全訪問策略。web

2.1 認證管理器配置方法

void configure(AuthenticationManagerBuilder auth) 用來配置認證管理器AuthenticationManager。說白了就是全部 UserDetails 相關的它都管,包含 PasswordEncoder 密碼機。若是你不清楚能夠經過 Spring Security 中的 UserDetail 進行了解。本文對 AuthenticationManager 不作具體分析講解,後面會有專門的文章來說這個東西 。 可經過 Spring Security 實戰系列 進行學習。spring

2.2 核心過濾器配置方法

void configure(WebSecurity web) 用來配置 WebSecurity 。而 WebSecurity 是基於 Servlet Filter 用來配置 springSecurityFilterChain 。而 springSecurityFilterChain 又被委託給了 Spring Security 核心過濾器 Bean DelegatingFilterProxy 。 相關邏輯你能夠在 WebSecurityConfiguration 中找到。咱們通常不會過多來自定義 WebSecurity , 使用較多的使其ignoring() 方法用來忽略 Spring Security 對靜態資源的控制。跨域

2.3 安全過濾器鏈配置方法

void configure(HttpSecurity http) 這個是咱們使用最多的,用來配置 HttpSecurityHttpSecurity 用於構建一個安全過濾器鏈 SecurityFilterChainSecurityFilterChain 最終被注入核心過濾器HttpSecurity 有許多咱們須要的配置。咱們能夠經過它來進行自定義安全訪問策略。因此咱們單獨開一章來說解這個東西。緩存

3. HttpSecurity 配置

HttpSecurity 是後面幾篇文章的重點,咱們將實際操做它來實現一些實用功能。因此本文要着重介紹它。安全

3.1 默認配置

protected void configure(HttpSecurity http) throws Exception {
          logger.debug("Using default configure(HttpSecurity). If subclassed this will potentially override subclass configure(HttpSecurity).");
  
          http
              .authorizeRequests()
                  .anyRequest().authenticated()
                  .and()
              .formLogin().and()
              .httpBasic();
      }複製代碼

上面是 Spring SecuritySpring Boot 中的默認配置。經過以上的配置,你的應用具有了一下的功能:session

  • 全部的請求訪問都須要被受權。
  • 使用 form 表單進行登錄(默認路徑爲/login),也就是前幾篇咱們見到的登陸頁。
  • 防止 CSRF 攻擊、 XSS 攻擊。
  • 啓用 HTTP Basic 認證

3.2 經常使用方法解讀

HttpSecurity 使用了builder 的構建方式來靈活制定訪問策略。最先基於 XML 標籤對 HttpSecurity 進行配置。如今大部分使用 javaConfig方式。經常使用的方法解讀以下:app

方法 說明
openidLogin() 用於基於 OpenId 的驗證
headers()
將安全標頭添加到響應,好比說簡單的 XSS 保護
cors() 配置跨域資源共享( CORS )
sessionManagement() 容許配置會話管理
portMapper() 容許配置一個PortMapper(HttpSecurity#(getSharedObject(class))),其餘提供SecurityConfigurer的對象使用 PortMapper 從 HTTP 重定向到 HTTPS 或者從 HTTPS 重定向到 HTTP。默認狀況下,Spring Security使用一個PortMapperImpl映射 HTTP 端口8080到 HTTPS 端口8443,HTTP 端口80到 HTTPS 端口443
jee() 配置基於容器的預認證。 在這種狀況下,認證由Servlet容器管理
x509() 配置基於x509的認證
rememberMe 容許配置「記住我」的驗證
authorizeRequests() 容許基於使用HttpServletRequest限制訪問
requestCache() 容許配置請求緩存
exceptionHandling() 容許配置錯誤處理
securityContext() 在HttpServletRequests之間的SecurityContextHolder上設置SecurityContext的管理。 當使用WebSecurityConfigurerAdapter時,這將自動應用
servletApi() 將HttpServletRequest方法與在其上找到的值集成到SecurityContext中。 當使用WebSecurityConfigurerAdapter時,這將自動應用
csrf() 添加 CSRF 支持,使用WebSecurityConfigurerAdapter時,默認啓用
logout() 添加退出登陸支持。當使用WebSecurityConfigurerAdapter時,這將自動應用。默認狀況是,訪問URL」/ logout」,使HTTP Session無效來清除用戶,清除已配置的任何#rememberMe()身份驗證,清除SecurityContextHolder,而後重定向到」/login?success」
anonymous() 容許配置匿名用戶的表示方法。 當與WebSecurityConfigurerAdapter結合使用時,這將自動應用。 默認狀況下,匿名用戶將使用org.springframework.security.authentication.AnonymousAuthenticationToken表示,幷包含角色 「ROLE_ANONYMOUS」
formLogin() 指定支持基於表單的身份驗證。若是未指定FormLoginConfigurer#loginPage(String),則將生成默認登陸頁面
oauth2Login() 根據外部OAuth 2.0或OpenID Connect 1.0提供程序配置身份驗證
requiresChannel() 配置通道安全。爲了使該配置有用,必須提供至少一個到所需信道的映射
httpBasic() 配置 Http Basic 驗證
addFilterBefore() 在指定的Filter類以前添加過濾器
addFilterAt() 在指定的Filter類的位置添加過濾器
addFilterAfter() 在指定的Filter類的以後添加過濾器
and() 鏈接以上策略的鏈接器,用來組合安全策略。實際上就是"並且"的意思

4. 總結

到今天爲止,咱們已經由淺入深學習了不少關於 Spring Security 的知識。已經具備開始自定義來實現一些實用的功能了,在後面的文章開始咱們將結合實際開發場景進行一些實戰操做。敬請關注公衆號:Felordcn 以第一時間獲取相關教程。cors

關注公衆號:Felordcn獲取更多資訊

我的博客:https://felord.cn

相關文章
相關標籤/搜索