Spring Security 實戰乾貨:圖解Spring Security中的Servlet過濾器體系

1. 前言

我在Spring Security 實戰乾貨:內置 Filter 全解析Spring Security的內置過濾器進行了羅列,可是Spring Security真正的過濾器體系纔是咱們瞭解它是如何進行"認證"、「受權」、「防止利用漏洞」的關鍵。html

2. Servlet Filter體系

這裏咱們以Servlet Web爲討論目標,Reactive Web暫不討論。咱們先來看下最基礎的Servlet體系,在Servlet體系中客戶端發起一個請求過程是通過0到N個Filter而後交給Servlet處理。java

servlet過濾器鏈

Filter不但能夠修改HttpServletRequestHttpServletResponse,可讓咱們在請求響應的先後作一些事情,甚至能夠終止過濾器鏈FilterChain的傳遞。spring

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
     // 請求被servlet 處理前 
      if(condition){
        // 根據條件來進入下一個過濾器
          chain.doFilter(request, response);  
      }
     // 請求被執行完畢後處理一些事情 
 }
複製代碼

因爲Filter僅影響下游FiltersServlet,所以每一個Filter調用的順序很是重要。Spring Security正是根據這個個特性來實現一系列的安全功能。接下來咱們來看看它們是如何結合的。安全

3. GenericFilterBean

在該系列的文章開篇我對Spring Security和Shiro進行了簡單的對比Spring Security利用了Spring IOCAOP的特性而沒法脫離Spring獨立存在,而Apache Shiro能夠獨立存在。因此今天咱們要一探究竟,看看他們是如何結合的。微信

Spring結合Servlet Filter天然是要爲Servlet Filter注入Spring Bean的特性,因此就搞出了一個抽象Filter Bean,這個抽象過濾器GenericFilterBean並非在Spring Security下,而是Spring Web體系中,類圖以下:學習

image-20200701162747774

從類圖上看Filter接口已經被注入了多個Spring Bean的特性,歸入了Spring Bean生命週期,使得Spring IoC容器可以充分的管理Filterurl

4. DelegatingFilterProxy

咱們但願Servlet可以按照它本身的標準來註冊到過濾器鏈中工做,可是同時也但願它可以被Spring IoC管理,因此Spring提供了一個GenericFilterBean的實現DelegatingFilterProxy。咱們能夠將原生的Servlet Filter或者Spring Bean Filter委託給DelegatingFilterProxy,而後在結合到Servlet FilterChain中。spa

DelegatingFilterProxy

5. SecurityFilterChain

針對不一樣符合Ant Pattern的請求可能會走不一樣的過濾器鏈,好比登陸會去驗證,而後返回登陸結果;管理後臺的接口走後臺的安全邏輯,應用客戶端的接口走客戶端的安全邏輯。Spring Security提供了一個SecurityFilterChain接口來知足被匹配HttpServletRequest走特定的過濾器鏈的需求。3d

public interface SecurityFilterChain {
    // 判斷請求 是否符合該過濾器鏈的要求
   boolean matches(HttpServletRequest request);
    // 對應的過濾器鏈
   List<Filter> getFilters();
}
複製代碼

SecurityFilterChain

6. FilterChainProxy

不一樣的SecurityFilterChain應該是互斥並且平等的,它們之間不該該是上下游關係。code

不一樣的請求通過不一樣的SecurityFilterChain

如上圖請求被匹配到不一樣的SecurityFilterChain而後在執行剩餘的過濾器鏈。它們通過SecurityFilterChain的總流程是類似的,並且有些時候特定的一些SecurityFilterChain也須要被集中管理來實現特定一攬子的請求的過濾邏輯。因此就有了另一個GenericFilterBean實現來作這個事情,它就是FilterChainProxy。它的做用就是攔截符合條件的請求,而後根據請求篩選出符合要求的SecurityFilterChain,而後鏈式的執行這些Filter,最後繼續執行剩下的FilterChain

擴展閱讀:Spring Security 過濾器鏈

7. 總結

結合上面,最終上述這些概念的關係完全搞清楚了,搞清楚過濾器的運做模式對於學習和使用Spring Security相當重要。

Spring Security Servlet過濾器鏈組織關係

多多關注微信公衆號:碼農小胖哥 獲取更多的技術乾貨。六月打榜結果已出請中獎的同窗速度聯繫我領取,另外七月打榜前三會送上熱門技術正版實體書籍, 打榜的要求只有一個關注、轉發、再看、點贊均可以增長本身的排名。

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

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

相關文章
相關標籤/搜索