Spring Security的工作原理

1 結構總覽

Spring Security所解決的問題就是安全訪問控制,而安全訪問控制功能其實就是對所有進入系統的請求進行攔截, 校驗每個請求是否能夠訪問它所期望的資源。而Spring Security對Web資源的保護是靠Filter實現的。當初始化Spring Security時,會建立一個名為 springSecurityFilterChain 的Servlet過濾器,型別為org。springframework。security。web。FilterChainProxy,它實現了javax。servlet。Filter,因此外部的請求會經過此 類,下圖是Spring Security過慮器鏈結構圖:

Spring Security的工作原理

FilterChainProxy是一個代理,真正起作用的是FilterChainProxy中SecurityFilterChain所包含的各個Filter,同時 這些Filter作為Bean被Spring管理,它們是Spring Security核心,各有各的職責,但他們並不直接處理使用者的認 證,也不直接處理使用者的授權,而是把它們交給了認證管理器(AuthenticationManager)和決策管理器 (AccessDecisionManager)進行處理。

spring Security功能的實現主要是由一系列過濾器鏈相互配合完成,如下圖:

Spring Security的工作原理

下面介紹過濾器鏈中主要的幾個過濾器及其作用:

SecurityContextPersistenceFilter :這個Filter是整個攔截過程的入口和出口(也就是第一個和最後一個攔截 器),會在請求開始時從配置好的 SecurityContextRepository 中獲取 SecurityContext,然後把它設定給 SecurityContextHolder。在請求完成後將 SecurityContextHolder 持有的 SecurityContext 再儲存到配置好的 SecurityContextRepository,同時清除 securityContextHolder 所持有的 SecurityContext;

UsernamePasswordAuthenticationFilter :用於處理來自表單提交的認證。該表單必須提供對應的使用者名稱和密碼,其內部還有登入成功或失敗後進行處理的 AuthenticationSuccessHandler 和 AuthenticationFailureHandler,這些都可以根據需求做相關改變; FilterSecurityInterceptor: 是用於保護web資源的,使用AccessDecisionManager對當前使用者進行授權訪問,前 面已經詳細介紹過了;

ExceptionTranslationFilter: 能夠捕獲來自 FilterChain 所有的異常,並進行處理。但是它只會處理兩類異常: AuthenticationException 和 AccessDeniedException,其它的異常它會繼續丟擲。

2 認證流程

Spring Security的工作原理

讓我們仔細分析認證過程:

使用者提交使用者名稱、密碼被SecurityFilterChain中的 UsernamePasswordAuthenticationFilter 過濾器獲取到, 封裝為請求Authentication,通常情況下是UsernamePasswordAuthenticationToken這個實現類。

然後過濾器將Authentication提交至認證管理器(AuthenticationManager)進行認證 。

認證成功後, AuthenticationManager 身份管理器返回一個被填充滿了資訊的(包括上面提到的許可權資訊, 身份資訊,細節資訊,但密碼通常會被移除) Authentication 例項。

SecurityContextHolder 安全上下文容器將第3步填充了資訊的 Authentication ,透過 SecurityContextHolder。getContext()。setAuthentication(…)方法,設定到其中。 可以看出AuthenticationManager介面(認證管理器)是認證相關的核心介面,也是發起認證的出發點,它 的實現類為ProviderManager。而Spring Security支援多種認證方式,因此ProviderManager維護著一個 List 列表,存放多種認證方式,最終實際的認證工作是由 AuthenticationProvider完成的。咱們知道web表單的對應的AuthenticationProvider實現類為 DaoAuthenticationProvider,它的內部又維護著一個UserDetailsService負責UserDetails的獲取。最終 AuthenticationProvider將UserDetails填充至Authentication。

3 授權策略

Spring Security可以透過 http。authorizeRequests() 對web請求進行授權保護。Spring Security使用標準Filter建立了對web請求的攔截,最終實現對資源的授權訪問。授權流程如下:

Spring Security的工作原理