在Spring Boot專案之中,我們引入Spring Security依賴,什麼也沒做,啟動專案Spring Security 就會生效,訪問請求就進行了攔截。
Spring Boot 對於 Spring Security 提供了自動化設定方案,可以使用較少的設定來使用 Spring Security。
那麼這個過濾器鍊是怎麼載入和實作攔截的呢?
當Spring Boot 專案啟動後,SecurityFilterAutoConfiguration
類會載入DelegatingFilterProxyRegistrationBean
註冊過濾器,名字為springSecurityFilterChain
。
注意:springSecurityFilterChain名字是固定寫死的。
DelegatingFilterProxyRegistrationBean
註冊成功後,該篩選器就被載入了到了註冊器中。然後呼叫getFilter()方法產生 DelegatingFilterProxy
代理物件並註冊到 IOC
中 。
#我們存取項目,就會進入DelegatingFilterProxy
類別的doFilter
。 。
DelegatingFilterProxy類別本質也是一個 Filter,其間接實作了 Filter接口,但是在 doFilter中其實呼叫的從 Spring 容器中取得的代理 Filter的實作類別。
傳回的 FilterChainProxy
物件。
由此可知,DelegatingFilterProxy
類別透過springSecurityFilterChain
這個名稱,得到了一個FilterChainProxy
過濾器,最終執行的是這個過濾器的doFilter
方法。
驗證 springSecurityFilterChain名詞不能修改
查看 initDelegate方法。
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;
驚不驚喜? 15個過濾器都在這裡了!
原來這些過濾器都會被封裝到 SecurityFilterChain物件中。
SecurityFilterChain
類別是個接口,實作類別也只有一個 DefaultSecurityFilterChain
類別。 DefaultSecurityFilterChain
類別的建構方法,初始化了 List filters,是透過傳參放進去的。
過濾器鏈參數是什麼時候傳入的?
建立Spring Security
過濾器鍊是交給Spring boot
自動配置,由SpringBootWebSecurityConfiguration
類別建立注入。
查看 WebSecurityConfigurerAdapter
類別。
然後會注入HttpSecurity對象,HttpSecurity可以理解為Spring Security 的http核心配置,存放Spring Security 中的過濾器鏈、請求匹配路徑等相關認證授權的重要方法。
然後開始建立 Spring Security 過濾器鏈了,是交給 Spring Boot自動配置,總共有 15個過濾器。
使用 OrderedFilter進行代理,並設定了order屬性。
新增完成後,將這些篩選器再封裝為 DefaultSecurityFilterChain物件。
最後透過 WebSecurityConfiguration設定載入 springSecurityFilterChain,WebSecurityConfiguration中維護了securityFilterChains屬性,會存放過濾器鏈中所有的過濾器。
以上是SpringBoot整合Spring Security過濾器鏈載入執行流程是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!