官方文檔地址
Spring Security?官方文檔地址?
其中重點(diǎn)章節(jié)是?Servlet Applications?這一章節(jié)從?Spring Security?架構(gòu)到使用都講述十分詳盡。本文是官方文檔的閱讀筆記。
三個(gè)重要類(lèi)
Spring Security?的初始化和認(rèn)證授權(quán)是圍繞下面三類(lèi)展開(kāi)的:
- DelegatingFilterProxy
- FilterChainProxy
- SecurityFilterChain
下文圍繞這三個(gè)核心類(lèi)進(jìn)行展開(kāi)。
容器中的過(guò)濾器
在 Java?Web?技術(shù)中,有 Servlet Filter Listener?三大組件,三大組件的生命周期都是?Web 容器進(jìn)行管理的。
Spring 提供了一個(gè)名為 DelegatingFilterProxy 的 Filter 實(shí)現(xiàn)類(lèi),其作用是在 Servlet 容器的生命周期和 Spring 的 ApplicationContext 之間進(jìn)行橋接。 Servlet 容器允許使用自己的標(biāo)準(zhǔn)注冊(cè)過(guò)濾器,但 Servlet?容器并不會(huì)接管 Spring Bean。 DelegatingFilterProxy 可以通過(guò)標(biāo)準(zhǔn) Servlet 容器機(jī)制注冊(cè),但將所有工作委托給實(shí)現(xiàn) Filter 的 Spring Bean。
?
因?DelegatingFilterProxy?是一個(gè)普通的過(guò)濾器,因此當(dāng)請(qǐng)求到達(dá) Web?容器時(shí),DelegatingFilterProxy?會(huì)被調(diào)用,接著 DelegatingFilterProxy?會(huì)調(diào)用?Spring Bean?中實(shí)現(xiàn)?Filter?接口的類(lèi)中方法。因此可以將過(guò)濾器分類(lèi)兩類(lèi),第一類(lèi)是由?Web?容器進(jìn)行管理,第二類(lèi)是由 Spring?進(jìn)行管理的,DelegatingFilterProxy?就是連接二者的橋梁。
需要注意的是?DelegatingFilterProxy?是?Spring?框架中類(lèi),而非?Spring Security?中。
管理多個(gè)過(guò)濾器鏈?
Spring Security?中有個(gè)十分核心的?Filter?實(shí)現(xiàn)類(lèi)?FilterChainProxy,其作用是用來(lái)管理?Spring Security?中各種過(guò)濾器鏈(并非 Servlet?容器中的過(guò)濾器鏈),可以認(rèn)為是?Spring Security 功能的入口。FilterChainProxy?被包裹在 DelegatingFilterProxy?中,因此調(diào)用時(shí)機(jī)也由?DelegatingFilterProxy?決定。
Spring?家族中有其他許多成員,各個(gè)成員核心功能的入口都不一樣,但是涉及到過(guò)濾器的功能,無(wú)一例外,都是由?DelegatingFilterProxy?進(jìn)行管理。
?
Servlet?容器管理?FilterChain,而?FilterChain?管理其中多個(gè)過(guò)濾器,DelegatingFilterProxy?作為其中一個(gè)過(guò)濾器也被?FilterChain?管理。DelegatingFilterProxy?又包裹了?FilterChainProxy。
FilterChainProxy?管理一系列名為 SecurityFilterChain?過(guò)濾器鏈。
常用過(guò)濾器
SecurityFilterChain?是一個(gè)過(guò)濾器鏈,其中包含了許多有序的過(guò)濾器(被稱(chēng)為?Security?Filter)。Spring Security?中有包含了許多的?SecurityFilterChain,而這些?SecurityFilterChain 統(tǒng)一由?FilterChainProxy 調(diào)用。
Spring Security?中有許多過(guò)濾器,其的功能均由有下面 32?個(gè)過(guò)濾器實(shí)現(xiàn)的(標(biāo)紅的是較為常用的過(guò)濾器):
- SecurityContextPersistenceFilter
- HeaderWriterFilter
- CorsFilter
- CsrfFilter
- LogoutFilter
- OAuth2AuthorizationRequestRedirectFilter
- Saml2WebSsoAuthenticationRequestFilter
- X509AuthenticationFilter
- AbstractPreAuthenticatedProcessingFilter
- CasAuthenticationFilter
- OAuth2LoginAuthenticationFilter
- Saml2WebSsoAuthenticationFilter
- UsernamePasswordAuthenticationFilter
- OpenIDAuthenticationFilter
- DefaultLoginPageGeneratingFilter
- DefaultLogoutPageGeneratingFilter
- ConcurrentSessionFilter
- DigestAuthenticationFilter
- BearerTokenAuthenticationFilter
- BasicAuthenticationFilter
- RequestCacheAwareFilter
- SecurityContextHolderAwareRequestFilter
- JaasApiIntegrationFilter
- RememberMeAuthenticationFilter
- AnonymousAuthenticationFilter
- OAuth2AuthorizationCodeGrantFilter
- SessionManagementFilter
- ExceptionTranslationFilter
- FilterSecurityInterceptor
- SwitchUserFilter
Spring Security?也是按照上面的順序調(diào)用過(guò)濾器,可能會(huì)略過(guò)一些過(guò)濾器,但順序不會(huì)變。
?
本文摘自 :https://www.cnblogs.com/