一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術(shù)|正則表達(dá)式|

服務(wù)器之家 - 編程語言 - JAVA教程 - Spring Security中的Servlet過濾器體系代碼分析

Spring Security中的Servlet過濾器體系代碼分析

2020-07-07 13:33碼農(nóng)小胖哥 JAVA教程

這篇文章主要介紹了Spring Security中的Servlet過濾器體系,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

1. 前言

我在Spring Security 實戰(zhàn)干貨:內(nèi)置 Filter 全解析Spring Security的內(nèi)置過濾器進(jìn)行了羅列,但是Spring Security真正的過濾器體系才是我們了解它是如何進(jìn)行"認(rèn)證"、“授權(quán)”、“防止利用漏洞”的關(guān)鍵。

2. Servlet Filter體系

這里我們以Servlet Web為討論目標(biāo),Reactive Web暫不討論。我們先來看下最基礎(chǔ)的Servlet體系,在Servlet體系中客戶端發(fā)起一個請求過程是經(jīng)過0到N個Filter然后交給Servlet處理。

Spring Security中的Servlet過濾器體系代碼分析

Filter不但可以修改HttpServletRequestHttpServletResponse,可以讓我們在請求響應(yīng)的前后做一些事情,甚至可以終止過濾器鏈FilterChain的傳遞。

?
1
2
3
4
5
6
7
8
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
   // 請求被servlet 處理前
   if(condition){
    // 根據(jù)條件來進(jìn)入下一個過濾器
     chain.doFilter(request, response);
   }
   // 請求被執(zhí)行完畢后處理一些事情
 }

由于Filter僅影響下游Filters和Servlet,因此每個Filter調(diào)用的順序非常重要。Spring Security正是根據(jù)這個個特性來實現(xiàn)一系列的安全功能。接下來我們來看看它們是如何結(jié)合的。

3. GenericFilterBean

在該系列的文章開篇我對Spring Security和Shiro進(jìn)行了簡單的對比。Spring Security利用了Spring IOC和AOP的特性而無法脫離Spring獨立存在,而Apache Shiro可以獨立存在。所以今天我們要一探究竟,看看他們是如何結(jié)合的。

Spring結(jié)合Servlet Filter自然是要為Servlet Filter注入Spring Bean的特性,所以就搞出了一個抽象Filter Bean,這個抽象過濾器GenericFilterBean并不是在Spring Security下,而是Spring Web體系中,類圖如下:

Spring Security中的Servlet過濾器體系代碼分析

從類圖上看Filter接口已經(jīng)被注入了多個Spring Bean的特性,納入了Spring Bean生命周期,使得Spring IoC容器能夠充分的管理Filter

4. DelegatingFilterProxy

我們希望Servlet能夠按照它自己的標(biāo)準(zhǔn)來注冊到過濾器鏈中工作,但是同時也希望它能夠被Spring IoC管理,所以Spring提供了一個GenericFilterBean的實現(xiàn)DelegatingFilterProxy。我們可以將原生的Servlet Filter或者Spring Bean Filter委托給DelegatingFilterProxy,然后在結(jié)合到Servlet FilterChain中。

Spring Security中的Servlet過濾器體系代碼分析

5. SecurityFilterChain

針對不同符合Ant Pattern的請求可能會走不同的過濾器鏈,比如登錄會去驗證,然后返回登錄結(jié)果;管理后臺的接口走后臺的安全邏輯,應(yīng)用客戶端的接口走客戶端的安全邏輯。Spring Security提供了一個SecurityFilterChain接口來滿足被匹配HttpServletRequest走特定的過濾器鏈的需求。

?
1
2
3
4
5
6
public interface SecurityFilterChain {
  // 判斷請求 是否符合該過濾器鏈的要求
  boolean matches(HttpServletRequest request);
  // 對應(yīng)的過濾器鏈
  List<Filter> getFilters();
}

Spring Security中的Servlet過濾器體系代碼分析

6. FilterChainProxy

不同的SecurityFilterChain應(yīng)該是互斥而且平等的,它們之間不應(yīng)該是上下游關(guān)系。

Spring Security中的Servlet過濾器體系代碼分析

如上圖請求被匹配到不同的SecurityFilterChain然后在執(zhí)行剩余的過濾器鏈。它們經(jīng)過SecurityFilterChain的總流程是相似的,而且有些時候特定的一些SecurityFilterChain也需要被集中管理來實現(xiàn)特定一攬子的請求的過濾邏輯。所以就有了另外一個GenericFilterBean實現(xiàn)來做這個事情,它就是FilterChainProxy。它的作用就是攔截符合條件的請求,然后根據(jù)請求篩選出符合要求的SecurityFilterChain,然后鏈?zhǔn)降膱?zhí)行這些Filter,最后繼續(xù)執(zhí)行剩下的FilterChain

擴展閱讀:Spring Security 過濾器鏈

7. 總結(jié)

結(jié)合上面,最終上述這些概念的關(guān)系徹底搞清楚了,搞清楚過濾器的運作模式對于學(xué)習(xí)和使用Spring Security至關(guān)重要。

Spring Security中的Servlet過濾器體系代碼分析

到此這篇關(guān)于Spring Security中的Servlet過濾器體系的文章就介紹到這了,更多相關(guān)Spring Security Servlet過濾器體系內(nèi)容請搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!

原文鏈接:https://www.cnblogs.com/felordcn/archive/2020/07/06/13253833.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 91精品免费国产高清在线 | 无码任你躁久久久久久久 | 18美女光胸光屁屁洗澡 | 明星ai人脸替换造梦在线播放 | 色综合久久最新中文字幕 | 久青草国产97香蕉在线视频 | 国内精品中文字幕 | 精品国产一区二区三区在线 | 喷奶水榨乳ova动漫无修 | 午夜宅男宅女看在线观看 | 99久久伊人精品波多野结衣 | 成人精品第一区二区三区 | 咪咪爱在线视频 | 久9青青cao精品视频在线 | 国产亚洲精品第一综合另类 | 久久久免费热线精品频 | 王的视频视ivk | 四虎免费影院4hu永久免费 | 欧洲第一页 | 粉嫩国产14xxxxx0000 | 女仆色网址| 欧美vpswindowssex| 国产玖玖在线 | 青草欧美 | 国产男女性特黄录像 | 亚洲成人国产精品 | 二区三区不卡不卡视频 | 免费视频亚洲 | ai换脸造梦jennie | 四虎在线成人免费网站 | 亚洲天堂男人网 | 双性总裁(h)| 无码AV熟妇素人内射V在线 | 亚洲第一色视频 | 俄罗斯男男激情1069gay | 无码国产成人777爽死在线观看 | 爱情岛论坛自拍永久入口 | 亚洲国产精品一区二区久久 | 欧美国产日本精品一区二区三区 | 国产在线影院 | 日噜噜|