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 的唯一實現類DefaultSecurityFilterChainmatches方法中打上斷點(圖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之後,依次執行瞭FilterChainProxyDefaultSecurityFilterChain

FilterChainProxy是一個過濾器鏈代理類,內部保存瞭過濾器鏈列表,而過濾器鏈內部又具有各種過濾器,如圖3。
DefaultSecurityFilterChain是SecurityFilterChain的默認實現

到此為止,我們的第一個問題“請求執行鏈路”基本已經清晰瞭,即DelegatingFilterProxy >> FilterChainProxy >> SecurityFilterChain >> Filter

在這裡插入圖片描述

圖3

到此這篇關於Spring Security的過濾器鏈機制的文章就介紹到這瞭,更多相關Spring Security過濾器鏈內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: