Spring Security 實戰(zhàn)干貨:自定義配置類入口WebSecurityConfigurerAdapter

1. 前言

今天我們要進(jìn)一步的的學(xué)習(xí)如何自定義配置 Spring Security 我們已經(jīng)多次提到了 WebSecurityConfigurerAdapter 鹤啡,而且我們知道 Spring Boot 中的自動配置實際上是通過自動配置包下的 SecurityAutoConfiguration 總配置類上導(dǎo)入的 Spring Boot Web 安全配置類 SpringBootWebSecurityConfiguration 來配置的漠其。所以我們就拿它開刀改淑。如果還是一頭霧水建議通過 https://felord.cn 查看 Spring Security 實戰(zhàn) 肤京。

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

我們使用我們最擅長的 Ctrl + C 随静、Ctrl + V 抄源碼中的 SpringBootWebSecurityConfiguration 士鸥,命名為我們自定義的 CustomSpringBootWebSecurityConfiguration :

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

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

2.1 認(rèn)證管理器配置方法

void configure(AuthenticationManagerBuilder auth) 用來配置認(rèn)證管理器AuthenticationManager洞拨。說白了就是所有 UserDetails 相關(guān)的它都管,包含 PasswordEncoder 密碼機负拟。如果你不清楚可以通過 Spring Security 中的 UserDetail 進(jìn)行了解烦衣。本文對 AuthenticationManager 不做具體分析講解,后面會有專門的文章來講這個東西 掩浙。 可通過 Spring Security 實戰(zhàn)系列 進(jìn)行學(xué)習(xí)花吟。

2.2 核心過濾器配置方法

void configure(WebSecurity web) 用來配置 WebSecurity 。而 WebSecurity 是基于 Servlet Filter 用來配置 springSecurityFilterChain 厨姚。而 springSecurityFilterChain 又被委托給了 Spring Security 核心過濾器 Bean DelegatingFilterProxy 衅澈。 相關(guān)邏輯你可以在 WebSecurityConfiguration 中找到。我們一般不會過多來自定義 WebSecurity , 使用較多的使其ignoring() 方法用來忽略 Spring Security 對靜態(tài)資源的控制谬墙。

2.3 安全過濾器鏈配置方法

void configure(HttpSecurity http) 這個是我們使用最多的今布,用來配置 HttpSecurity 经备。 HttpSecurity 用于構(gòu)建一個安全過濾器鏈 SecurityFilterChainSecurityFilterChain 最終被注入核心過濾器 部默。 HttpSecurity 有許多我們需要的配置侵蒙。我們可以通過它來進(jìn)行自定義安全訪問策略。所以我們單獨開一章來講解這個東西傅蹂。

3. HttpSecurity 配置

HttpSecurity 是后面幾篇文章的重點纷闺,我們將實際操作它來實現(xiàn)一些實用功能。所以本文要著重介紹它份蝴。

3.1 默認(rèn)配置

   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 中的默認(rèn)配置犁功。通過以上的配置,你的應(yīng)用具備了一下的功能:

  • 所有的請求訪問都需要被授權(quán)婚夫。
  • 使用 form 表單進(jìn)行登陸(默認(rèn)路徑為/login)浸卦,也就是前幾篇我們見到的登錄頁。
  • 防止 CSRF 攻擊请敦、 XSS 攻擊。
  • 啟用 HTTP Basic 認(rèn)證

3.2 常用方法解讀

HttpSecurity 使用了builder 的構(gòu)建方式來靈活制定訪問策略储玫。最早基于 XML 標(biāo)簽對 HttpSecurity 進(jìn)行配置∈躺福現(xiàn)在大部分使用 javaConfig方式。常用的方法解讀如下:

方法 說明
openidLogin() 用于基于 OpenId 的驗證
headers() 將安全標(biāo)頭添加到響應(yīng),比如說簡單的 XSS 保護(hù)
cors() 配置跨域資源共享( CORS )
sessionManagement() 允許配置會話管理
portMapper() 允許配置一個PortMapper(HttpSecurity#(getSharedObject(class)))撒穷,其他提供SecurityConfigurer的對象使用 PortMapper 從 HTTP 重定向到 HTTPS 或者從 HTTPS 重定向到 HTTP匣椰。默認(rèn)情況下,Spring Security使用一個PortMapperImpl映射 HTTP 端口8080到 HTTPS 端口8443端礼,HTTP 端口80到 HTTPS 端口443
jee() 配置基于容器的預(yù)認(rèn)證禽笑。 在這種情況下,認(rèn)證由Servlet容器管理
x509() 配置基于x509的認(rèn)證
rememberMe 允許配置“記住我”的驗證
authorizeRequests() 允許基于使用HttpServletRequest限制訪問
requestCache() 允許配置請求緩存
exceptionHandling() 允許配置錯誤處理
securityContext() 在HttpServletRequests之間的SecurityContextHolder上設(shè)置SecurityContext的管理蛤奥。 當(dāng)使用WebSecurityConfigurerAdapter時佳镜,這將自動應(yīng)用
servletApi() 將HttpServletRequest方法與在其上找到的值集成到SecurityContext中。 當(dāng)使用WebSecurityConfigurerAdapter時凡桥,這將自動應(yīng)用
csrf() 添加 CSRF 支持蟀伸,使用WebSecurityConfigurerAdapter時,默認(rèn)啟用
logout() 添加退出登錄支持缅刽。當(dāng)使用WebSecurityConfigurerAdapter時啊掏,這將自動應(yīng)用。默認(rèn)情況是衰猛,訪問URL”/ logout”迟蜜,使HTTP Session無效來清除用戶,清除已配置的任何#rememberMe()身份驗證啡省,清除SecurityContextHolder娜睛,然后重定向到”/login?success”
anonymous() 允許配置匿名用戶的表示方法髓霞。 當(dāng)與WebSecurityConfigurerAdapter結(jié)合使用時,這將自動應(yīng)用微姊。 默認(rèn)情況下酸茴,匿名用戶將使用org.springframework.security.authentication.AnonymousAuthenticationToken表示,并包含角色 “ROLE_ANONYMOUS”
formLogin() 指定支持基于表單的身份驗證兢交。如果未指定FormLoginConfigurer#loginPage(String)薪捍,則將生成默認(rèn)登錄頁面
oauth2Login() 根據(jù)外部OAuth 2.0或OpenID Connect 1.0提供程序配置身份驗證
requiresChannel() 配置通道安全。為了使該配置有用配喳,必須提供至少一個到所需信道的映射
httpBasic() 配置 Http Basic 驗證
addFilterBefore() 在指定的Filter類之前添加過濾器
addFilterAt() 在指定的Filter類的位置添加過濾器
addFilterAfter() 在指定的Filter類的之后添加過濾器
and() 連接以上策略的連接器酪穿,用來組合安全策略。實際上就是"而且"的意思

4. 總結(jié)

到今天為止晴裹,我們已經(jīng)由淺入深學(xué)習(xí)了很多關(guān)于 Spring Security 的知識被济。已經(jīng)具有開始自定義來實現(xiàn)一些實用的功能了,在后面的文章開始我們將結(jié)合實際開發(fā)場景進(jìn)行一些實戰(zhàn)操作涧团。敬請關(guān)注公眾號:Felordcn 以第一時間獲取相關(guān)教程只磷。

關(guān)注公眾號:碼農(nóng)小胖哥,獲取更多資訊

個人博客:https://felord.cn

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末泌绣,一起剝皮案震驚了整個濱河市钮追,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌阿迈,老刑警劉巖元媚,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異苗沧,居然都是意外死亡刊棕,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門待逞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來甥角,“玉大人,你說我怎么就攤上這事识樱◎谂颍” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵牺荠,是天一觀的道長翁巍。 經(jīng)常有香客問我,道長休雌,這世上最難降的妖魔是什么灶壶? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮杈曲,結(jié)果婚禮上驰凛,老公的妹妹穿的比我還像新娘胸懈。我一直安慰自己,他們只是感情好恰响,可當(dāng)我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布趣钱。 她就那樣靜靜地躺著,像睡著了一般胚宦。 火紅的嫁衣襯著肌膚如雪首有。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天枢劝,我揣著相機與錄音井联,去河邊找鬼。 笑死您旁,一個胖子當(dāng)著我的面吹牛烙常,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鹤盒,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼蚕脏,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了侦锯?” 一聲冷哼從身側(cè)響起驼鞭,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎率触,沒想到半個月后终议,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體汇竭,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡葱蝗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了细燎。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片两曼。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖玻驻,靈堂內(nèi)的尸體忽然破棺而出悼凑,到底是詐尸還是另有隱情,我是刑警寧澤璧瞬,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布户辫,位于F島的核電站,受9級特大地震影響嗤锉,放射性物質(zhì)發(fā)生泄漏渔欢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一瘟忱、第九天 我趴在偏房一處隱蔽的房頂上張望奥额。 院中可真熱鬧苫幢,春花似錦、人聲如沸垫挨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽九榔。三九已至哀峻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間帚屉,已是汗流浹背谜诫。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留攻旦,地道東北人喻旷。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像牢屋,于是被迫代替她去往敵國和親且预。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容