Spring Security的過濾器鏈機制
推薦閱讀
前言
在“碼農小胖哥”的文章中提到一個關鍵的過濾器鏈SecurityFilterChain
,當一個請求 HttpServletRequest 進入 SecurityFilterChain
時,會通過 matches
方法來確定是否滿足條件進入過濾器鏈,進而決定請求應該執行哪些過濾器。下面我們自己來梳理一遍。
請求執行鏈路
我們以之前的文章為例,使用@Configuration
配置瞭一個SecurityFilterChain
Bean,能在Spring Boot 啟動的時候創建SecurityFilterChain Bean到Sping。
@Configuration public class OAuth2LoginConfig @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http .authorizeHttpRequests(authorize -> authorize .anyRequest().authenticated() ) .oauth2Login(withDefaults()); return http.build(); }
這是官網的配置,說明任何請求都可以通過OAuth2來登錄。上面說過任何請求都會經過SecurityFilterChain 的matches
方法,因此我們可以在SecurityFilterChain 的唯一實現類DefaultSecurityFilterChain
的matches
方法中打上斷點(圖1),這樣當進入斷點的時候,可以直觀的從IDE中看到調用棧
,這是調式源碼的時候一個非常有用的方法。
圖1
啟動應用,請求一個接口localhost:8080/hello,進入端點後的調用棧如圖:
圖2
圖中箭頭所指的DelegatingFilterProxy
為Spring提供的一個標準的Servlet Filter代理,在xml的Spring時代,為瞭能使用Spring Security,需要在web.xml中添加該過濾器,而在Spring Boot中,Spring Boot的自動配置已經幫我們搞定,具體可見SecurityFilterAutoConfiguration
。
箭頭前面一部分是其他的幾個Servlet Filter,我們不做瞭解。
箭頭後面的部分,即DelegatingFilterProxy
之後,依次執行瞭FilterChainProxy
和DefaultSecurityFilterChain
FilterChainProxy
是一個過濾器鏈代理類,內部保存瞭過濾器鏈列表,而過濾器鏈內部又具有各種過濾器
,如圖3。DefaultSecurityFilterChain
是SecurityFilterChain的默認實現
到此為止,我們的第一個問題“請求執行鏈路”基本已經清晰瞭,即DelegatingFilterProxy >> FilterChainProxy >> SecurityFilterChain >> Filter
圖3
到此這篇關於Spring Security的過濾器鏈機制的文章就介紹到這瞭,更多相關Spring Security過濾器鏈內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Spring Security過濾器鏈加載執行流程源碼解析
- Spring Security 過濾器註冊脈絡梳理
- Spring Security和自定義filter的沖突導致多執行的解決方案
- Spring Boot security 默認攔截靜態資源的解決方法
- SpringBoot+SpringSecurity+JWT實現系統認證與授權示例