SpringBoot整合Spring?Security過濾器鏈加載執(zhí)行流程源碼分析(最新推薦)
1.引言
在 Spring Boot項(xiàng)目之中,我們引入 Spring Security依賴,什么也沒做,啟動(dòng)項(xiàng)目 Spring Security 就會(huì)生效,訪問請(qǐng)求就進(jìn)行了攔截。
Spring Boot 對(duì)于 Spring Security 提供了自動(dòng)化配置方案,可以使用更少的配置來使用 Spring Security。
那么這個(gè)過濾器鏈?zhǔn)窃趺醇虞d和實(shí)現(xiàn)攔截的呢?
2.Spring Security過濾器鏈加載
2.1.注冊(cè)名為 springSecurityFilterChain的過濾器
當(dāng) Spring Boot 項(xiàng)目啟動(dòng)后,SecurityFilterAutoConfiguration
類會(huì)加載 DelegatingFilterProxyRegistrationBean
注冊(cè)過濾器,名字為 springSecurityFilterChain
。
注意:springSecurityFilterChain名字是固定寫死的。
DelegatingFilterProxyRegistrationBean
注冊(cè)成功后,該過濾器就被加載了到了注冊(cè)器中。然后調(diào)用getFilter()方法生成 DelegatingFilterProxy
代理對(duì)象并注冊(cè)到 IOC
中 。
3、查看 DelegatingFilterProxy類
我們?cè)L問項(xiàng)目,就會(huì)進(jìn)入 DelegatingFilterProxy
類的 doFilter
方法。
DelegatingFilterProxy類本質(zhì)也是一個(gè) Filter,其間接實(shí)現(xiàn)了 Filter接口,但是在 doFilter中其實(shí)調(diào)用的從 Spring 容器中獲取到的代理 Filter的實(shí)現(xiàn)類。
返回的 FilterChainProxy
對(duì)象。
由此可知,DelegatingFilterProxy
類通過 springSecurityFilterChain
這個(gè)名稱,得到了一個(gè) FilterChainProxy
過濾器,最終執(zhí)行的是這個(gè)過濾器的 doFilter
方法。
驗(yàn)證 springSecurityFilterChain名詞不能修改
查看 initDelegate方法。
4.查看 FilterChainProxy類
FilterChainProxy
類本質(zhì)也是一個(gè) Filter,所以查看 doFilter
方法。留意該類里面的屬性。
public class FilterChainProxy extends GenericFilterBean { private static final Log logger = LogFactory.getLog(FilterChainProxy.class); private static final String FILTER_APPLIED = FilterChainProxy.class.getName().concat(".APPLIED"); // 過濾器鏈 private List<SecurityFilterChain> filterChains; private FilterChainProxy.FilterChainValidator filterChainValidator; private HttpFirewall firewall;
4.1 查看 doFilterInternal方法
驚不驚喜?15個(gè)過濾器都在這里了!
4.2 查看 getFilters方法
原來這些過濾器都被封裝進(jìn) SecurityFilterChain對(duì)象中。
5 查看 SecurityFilterChain接口
SecurityFilterChain
類是個(gè)接口,實(shí)現(xiàn)類也只有一個(gè) DefaultSecurityFilterChain
類。DefaultSecurityFilterChain
類的構(gòu)造方法,初始化了 List filters,是通過傳參放進(jìn)去的。
過濾器鏈參數(shù)是什么時(shí)候傳入的?
6. 查看 SpringBootWebSecurityConfiguration類
創(chuàng)建 Spring Security
過濾器鏈?zhǔn)墙唤o Spring boot
自動(dòng)配置,由 SpringBootWebSecurityConfiguration
類創(chuàng)建注入。
查看 WebSecurityConfigurerAdapter
類。
然后會(huì)注入 HttpSecurity對(duì)象,HttpSecurity可以理解為 Spring Security 的 http核心配置,存放 Spring Security 中的過濾器鏈、請(qǐng)求匹配路徑等相關(guān)認(rèn)證授權(quán)的重要方法。
然后開始創(chuàng)建 Spring Security 過濾器鏈了,是交給 Spring Boot自動(dòng)配置,一共有 15個(gè)過濾器。
使用 OrderedFilter進(jìn)行代理,并設(shè)置了order屬性。
添加完成后,將這些過濾器再封裝為 DefaultSecurityFilterChain對(duì)象。
最后通過 WebSecurityConfiguration配置加載 springSecurityFilterChain,WebSecurityConfiguration中維護(hù)了securityFilterChains屬性,會(huì)存放過濾器鏈中所有的過濾器。
總結(jié):
Spring boot 通過 DelegatingFilterProxyRegistrationBean
注冊(cè)過濾器,名字為 springSecurityFilterChain
,并生成 DelegatingFilterProxy
代理對(duì)象并注冊(cè)到 IoC中。最終真正調(diào)用 FilterChainProxy
過濾器的 doFilter
獲取到 Spring Security 過濾器鏈
。
Spring Security的過濾器鏈在底層是封裝在 SecurityFilterChain接口中的。
到此這篇關(guān)于SpringBoot整合Spring Security過濾器鏈加載執(zhí)行流程源碼分析的文章就介紹到這了,更多相關(guān)SpringBoot整合Spring Security過濾器鏈內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring中ApplicationEvent事件機(jī)制源碼詳解
這篇文章主要介紹了Spring中ApplicationEvent事件機(jī)制源碼詳解,Spring中與事件有關(guān)的接口和類主要包括ApplicationEvent、ApplicationListener,下面來看一下Spring中事件的具體應(yīng)用,需要的朋友可以參考下2023-09-09深入Java7的一些新特性以及對(duì)腳本語言支持API的介紹
本篇文章是對(duì)Java7的一些新特性以及對(duì)腳本語言支持API的概述,需要的朋友參考下2013-05-05解決@DateTimeFormat格式化時(shí)間出錯(cuò)問題
這篇文章主要介紹了解決@DateTimeFormat格式化時(shí)間出錯(cuò)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12Java 反射獲取類詳細(xì)信息的常用方法總結(jié)
Java 反射獲取類詳細(xì)信息的常用方法總結(jié),需要的朋友可以參考一下2013-03-03說說@ModelAttribute在父類和子類中的執(zhí)行順序
這篇文章主要介紹了@ModelAttribute在父類和子類中的執(zhí)行順序,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06Java中ArrayList去除重復(fù)元素(包括字符串和自定義對(duì)象)
本文主要介紹了Java中ArrayList去除重復(fù)元素(包括字符串和自定義對(duì)象)的方法。具有很好的參考價(jià)值。下面跟著小編一起來看下吧2017-03-03java使用EasyExcel導(dǎo)入導(dǎo)出excel
導(dǎo)入導(dǎo)出excel數(shù)據(jù)是常見的需求,今天就來看一下Java基于EasyExcel實(shí)現(xiàn)這個(gè)功能,感興趣的朋友可以了解下2021-05-05