SpringBoot整合Spring?Security過濾器鏈加載執(zhí)行流程源碼分析(最新推薦)

1.引言
在 Spring Boot項目之中,我們引入 Spring Security依賴,什么也沒做,啟動項目 Spring Security 就會生效,訪問請求就進行了攔截。
Spring Boot 對于 Spring Security 提供了自動化配置方案,可以使用更少的配置來使用 Spring Security。
那么這個過濾器鏈是怎么加載和實現(xiàn)攔截的呢?
2.Spring Security過濾器鏈加載
2.1.注冊名為 springSecurityFilterChain的過濾器
當 Spring Boot 項目啟動后,SecurityFilterAutoConfiguration類會加載 DelegatingFilterProxyRegistrationBean注冊過濾器,名字為 springSecurityFilterChain。

注意:springSecurityFilterChain名字是固定寫死的。
DelegatingFilterProxyRegistrationBean 注冊成功后,該過濾器就被加載了到了注冊器中。然后調用getFilter()方法生成 DelegatingFilterProxy代理對象并注冊到 IOC中 。

3、查看 DelegatingFilterProxy類
我們訪問項目,就會進入 DelegatingFilterProxy類的 doFilter方法。
DelegatingFilterProxy類本質也是一個 Filter,其間接實現(xiàn)了 Filter接口,但是在 doFilter中其實調用的從 Spring 容器中獲取到的代理 Filter的實現(xiàn)類。

返回的 FilterChainProxy對象。
由此可知,DelegatingFilterProxy類通過 springSecurityFilterChain這個名稱,得到了一個 FilterChainProxy過濾器,最終執(zhí)行的是這個過濾器的 doFilter方法。
驗證 springSecurityFilterChain名詞不能修改
查看 initDelegate方法。

4.查看 FilterChainProxy類
FilterChainProxy類本質也是一個 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個過濾器都在這里了!

4.2 查看 getFilters方法
原來這些過濾器都被封裝進 SecurityFilterChain對象中。

5 查看 SecurityFilterChain接口
SecurityFilterChain類是個接口,實現(xiàn)類也只有一個 DefaultSecurityFilterChain類。DefaultSecurityFilterChain類的構造方法,初始化了 List filters,是通過傳參放進去的。

過濾器鏈參數(shù)是什么時候傳入的?
6. 查看 SpringBootWebSecurityConfiguration類
創(chuàng)建 Spring Security 過濾器鏈是交給 Spring boot 自動配置,由 SpringBootWebSecurityConfiguration類創(chuàng)建注入。

查看 WebSecurityConfigurerAdapter類。

然后會注入 HttpSecurity對象,HttpSecurity可以理解為 Spring Security 的 http核心配置,存放 Spring Security 中的過濾器鏈、請求匹配路徑等相關認證授權的重要方法。
然后開始創(chuàng)建 Spring Security 過濾器鏈了,是交給 Spring Boot自動配置,一共有 15個過濾器。
使用 OrderedFilter進行代理,并設置了order屬性。
添加完成后,將這些過濾器再封裝為 DefaultSecurityFilterChain對象。
最后通過 WebSecurityConfiguration配置加載 springSecurityFilterChain,WebSecurityConfiguration中維護了securityFilterChains屬性,會存放過濾器鏈中所有的過濾器。
總結:
Spring boot 通過 DelegatingFilterProxyRegistrationBean注冊過濾器,名字為 springSecurityFilterChain,并生成 DelegatingFilterProxy代理對象并注冊到 IoC中。最終真正調用 FilterChainProxy過濾器的 doFilter 獲取到 Spring Security 過濾器鏈。
Spring Security的過濾器鏈在底層是封裝在 SecurityFilterChain接口中的。
到此這篇關于SpringBoot整合Spring Security過濾器鏈加載執(zhí)行流程源碼分析的文章就介紹到這了,更多相關SpringBoot整合Spring Security過濾器鏈內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Spring中ApplicationEvent事件機制源碼詳解
這篇文章主要介紹了Spring中ApplicationEvent事件機制源碼詳解,Spring中與事件有關的接口和類主要包括ApplicationEvent、ApplicationListener,下面來看一下Spring中事件的具體應用,需要的朋友可以參考下2023-09-09
說說@ModelAttribute在父類和子類中的執(zhí)行順序
這篇文章主要介紹了@ModelAttribute在父類和子類中的執(zhí)行順序,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06
Java中ArrayList去除重復元素(包括字符串和自定義對象)
本文主要介紹了Java中ArrayList去除重復元素(包括字符串和自定義對象)的方法。具有很好的參考價值。下面跟著小編一起來看下吧2017-03-03

