日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

全面解析Spring Security 內置 Filter

瀏覽:163日期:2023-08-29 08:35:42

1. 前言

上一文我們使用 Spring Security 實現了各種登錄聚合的場面。其中我們是通過在 UsernamePasswordAuthenticationFilter 之前一個自定義的過濾器實現的。我怎么知道自定義過濾器要加在 UsernamePasswordAuthenticationFilter 之前。我在這個系列開篇說了Spring Security 權限控制的一個核心關鍵就是 過濾器鏈 ,這些過濾器如下圖進行過濾傳遞,甚至比這個更復雜!這只是一個最小單元。

全面解析Spring Security 內置 Filter

Spring Security 內置了一些過濾器,他們各有各的本事。如果你掌握了這些過濾器,很多實際開發中的需求和問題都很容易解決。今天我們來見識一下這些內置的過濾器。

2. 內置過濾器初始化

在 Spring Security 初始化核心過濾器時 HttpSecurity 會通過將 Spring Security 內置的一些過濾器以 FilterComparator 提供的規則進行比較按照比較結果進行排序注冊。

2.1 排序規則

FilterComparator 維護了一個順序的注冊表 filterToOrder 。

FilterComparator() { Step order = new Step(INITIAL_ORDER, ORDER_STEP); put(ChannelProcessingFilter.class, order.next()); put(ConcurrentSessionFilter.class, order.next()); put(WebAsyncManagerIntegrationFilter.class, order.next()); put(SecurityContextPersistenceFilter.class, order.next()); put(HeaderWriterFilter.class, order.next()); put(CorsFilter.class, order.next()); put(CsrfFilter.class, order.next()); put(LogoutFilter.class, order.next()); filterToOrder.put( 'org.springframework.security.oauth2.client.web.OAuth2AuthorizationRequestRedirectFilter', order.next()); filterToOrder.put( 'org.springframework.security.saml2.provider.service.servlet.filter.Saml2WebSsoAuthenticationRequestFilter', order.next()); put(X509AuthenticationFilter.class, order.next()); put(AbstractPreAuthenticatedProcessingFilter.class, order.next()); filterToOrder.put('org.springframework.security.cas.web.CasAuthenticationFilter', order.next()); filterToOrder.put( 'org.springframework.security.oauth2.client.web.OAuth2LoginAuthenticationFilter', order.next()); filterToOrder.put( 'org.springframework.security.saml2.provider.service.servlet.filter.Saml2WebSsoAuthenticationFilter', order.next()); put(UsernamePasswordAuthenticationFilter.class, order.next()); put(ConcurrentSessionFilter.class, order.next()); filterToOrder.put( 'org.springframework.security.openid.OpenIDAuthenticationFilter', order.next()); put(DefaultLoginPageGeneratingFilter.class, order.next()); put(DefaultLogoutPageGeneratingFilter.class, order.next()); put(ConcurrentSessionFilter.class, order.next()); put(DigestAuthenticationFilter.class, order.next()); filterToOrder.put( 'org.springframework.security.oauth2.server.resource.web.BearerTokenAuthenticationFilter', order.next()); put(BasicAuthenticationFilter.class, order.next()); put(RequestCacheAwareFilter.class, order.next()); put(SecurityContextHolderAwareRequestFilter.class, order.next()); put(JaasApiIntegrationFilter.class, order.next()); put(RememberMeAuthenticationFilter.class, order.next()); put(AnonymousAuthenticationFilter.class, order.next()); filterToOrder.put( 'org.springframework.security.oauth2.client.web.OAuth2AuthorizationCodeGrantFilter', order.next()); put(SessionManagementFilter.class, order.next()); put(ExceptionTranslationFilter.class, order.next()); put(FilterSecurityInterceptor.class, order.next()); put(SwitchUserFilter.class, order.next()); }

這些就是所有內置的過濾器。 他們是通過下面的方法獲取自己的序號:

private Integer getOrder(Class<?> clazz) { while (clazz != null) { Integer result = filterToOrder.get(clazz.getName()); if (result != null) { return result; } clazz = clazz.getSuperclass(); } return null; }

通過過濾器的類全限定名從注冊表 filterToOrder 中獲取自己的序號,如果沒有直接獲取到序號通過遞歸獲取父類在注冊表中的序號作為自己的序號,序號越小優先級越高。上面的過濾器并非全部會被初始化。有的需要額外引入一些功能包,有的看 HttpSecurity 的配置情況。 在上一篇文章中。我們禁用了 CSRF 功能,就意味著 CsrfFilter 不會被注冊。

3. 內置過濾器講解

接下來我們就對這些內置過濾器進行一個系統的認識。我們將按照默認順序進行講解。

3.1 ChannelProcessingFilter

ChannelProcessingFilter 通常是用來過濾哪些請求必須用 https 協議, 哪些請求必須用 http 協議, 哪些請求隨便用哪個協議都行。它主要有兩個屬性:

ChannelDecisionManager 用來判斷請求是否符合既定的協議規則。它維護了一個 ChannelProcessor 列表 這些ChannelProcessor 是具體用來執行 ANY_CHANNEL 策略 (任何通道都可以), REQUIRES_SECURE_CHANNEL 策略 (只能通過https 通道), REQUIRES_INSECURE_CHANNEL 策略 (只能通過 http 通道)。 FilterInvocationSecurityMetadataSource 用來存儲 url 與 對應的ANY_CHANNEL、REQUIRES_SECURE_CHANNEL、REQUIRES_INSECURE_CHANNEL 的映射關系。

ChannelProcessingFilter 通過 HttpScurity#requiresChannel() 等相關方法引入其配置對象 ChannelSecurityConfigurer 來進行配置。

3.2 ConcurrentSessionFilter

ConcurrentSessionFilter 主要用來判斷session是否過期以及更新最新的訪問時間。其流程為:

session 檢測,如果不存在直接放行去執行下一個過濾器。存在則進行下一步。根據sessionid從SessionRegistry中獲取SessionInformation,從SessionInformation中獲取session是否過期;沒有過期則更新SessionInformation中的訪問日期;如果過期,則執行doLogout()方法,這個方法會將session無效,并將 SecurityContext 中的Authentication中的權限置空,同時在SecurityContenxtHoloder中清除SecurityContext然后查看是否有跳轉的 expiredUrl,如果有就跳轉,沒有就輸出提示信息。

ConcurrentSessionFilter 通過SessionManagementConfigurer 來進行配置。

3.3 WebAsyncManagerIntegrationFilter

WebAsyncManagerIntegrationFilter用于集成SecurityContext到Spring異步執行機制中的WebAsyncManager。用來處理異步請求的安全上下文。具體邏輯為:

從請求屬性上獲取所綁定的WebAsyncManager,如果尚未綁定,先做綁定。從asyncManager 中獲取 key 為 CALLABLE_INTERCEPTOR_KEY 的安全上下文多線程處理器 SecurityContextCallableProcessingInterceptor, 如果獲取到的為 null,新建一個 SecurityContextCallableProcessingInterceptor 并綁定 CALLABLE_INTERCEPTOR_KEY 注冊到 asyncManager 中。

這里簡單說一下 SecurityContextCallableProcessingInterceptor 。它實現了接口 CallableProcessingInterceptor,當它被應用于一次異步執行時,beforeConcurrentHandling() 方法會在調用者線程執行,該方法會相應地從當前線程獲取SecurityContext,然后被調用者線程中執行邏輯時,會使用這個 SecurityContext,從而實現安全上下文從調用者線程到被調用者線程的傳輸。

WebAsyncManagerIntegrationFilter 通過 WebSecurityConfigurerAdapter#getHttp()方法添加到 HttpSecurity 中成為 DefaultSecurityFilterChain 的一個鏈節。

3.4 SecurityContextPersistenceFilter

SecurityContextPersistenceFilter 主要控制 SecurityContext 的在一次請求中的生命周期 。 請求來臨時,創建SecurityContext 安全上下文信息,請求結束時清空 SecurityContextHolder。

SecurityContextPersistenceFilter 通過 HttpScurity#securityContext() 及相關方法引入其配置對象 SecurityContextConfigurer 來進行配置。

3.5 HeaderWriterFilter

HeaderWriterFilter 用來給 http 響應添加一些 Header,比如 X-Frame-Options, X-XSS-Protection ,X-Content-Type-Options。

你可以通過 HttpScurity#headers() 來定制請求Header 。

3.6 CorsFilter

跨域相關的過濾器。這是Spring MVC Java配置和XML 命名空間 CORS 配置的替代方法, 僅對依賴于spring-web的應用程序有用(不適用于spring-webmvc)或 要求在javax.servlet.Filter 級別進行CORS檢查的安全約束鏈接。這個是目前官方的一些解讀,但是我還是不太清楚實際機制。

你可以通過 HttpSecurity#cors() 來定制。

3.7 CsrfFilter

CsrfFilter 用于防止csrf攻擊,前后端使用json交互需要注意的一個問題。

你可以通過 HttpSecurity.csrf() 來開啟或者關閉它。在你使用 jwt 等 token 技術時,是不需要這個的。

3.8 LogoutFilter

LogoutFilter 很明顯這是處理注銷的過濾器。

你可以通過 HttpSecurity.logout() 來定制注銷邏輯,非常有用。

3.9 OAuth2AuthorizationRequestRedirectFilter

和上面的有所不同,這個需要依賴 spring-scurity-oauth2 相關的模塊。該過濾器是處理 OAuth2 請求首選重定向相關邏輯的。

3.10 Saml2WebSsoAuthenticationRequestFilter

這個需要用到 Spring Security SAML 模塊,這是一個基于 SMAL 的 SSO 單點登錄請求認證過濾器。

關于SAML

SAML 即安全斷言標記語言,英文全稱是 Security Assertion Markup Language。它是一個基于 XML 的標準,用于在不同的安全域(security domain)之間交換認證和授權數據。在 SAML 標準定義了身份提供者 (identity provider) 和服務提供者 (service provider),這兩者構成了前面所說的不同的安全域。 SAML 是 OASIS 組織安全服務技術委員會(Security Services Technical Committee) 的產品。

SAML(Security Assertion Markup Language)是一個 XML 框架,也就是一組協議,可以用來傳輸安全聲明。比如,兩臺遠程機器之間要通訊,為了保證安全,我們可以采用加密等措施,也可以采用 SAML 來傳輸,傳輸的數據以 XML 形式,符合 SAML 規范,這樣我們就可以不要求兩臺機器采用什么樣的系統,只要求能理解 SAML 規范即可,顯然比傳統的方式更好。SAML 規范是一組 Schema 定義。

可以這么說,在Web Service 領域,schema 就是規范,在 Java 領域,API 就是規范

3.11 X509AuthenticationFilter

X509 認證過濾器。你可以通過 HttpSecurity#X509() 來啟用和配置相關功能。

3.12 AbstractPreAuthenticatedProcessingFilter

AbstractPreAuthenticatedProcessingFilter 處理處理經過預先認證的身份驗證請求的過濾器的基類,其中認證主體已經由外部系統進行了身份驗證。 目的只是從傳入請求中提取主體上的必要信息,而不是對它們進行身份驗證。

你可以繼承該類進行具體實現并通過 HttpSecurity#addFilter 方法來添加個性化的AbstractPreAuthenticatedProcessingFilter 。

3.13 CasAuthenticationFilter

CAS 單點登錄認證過濾器 。依賴 Spring Security CAS 模塊

3.14 OAuth2LoginAuthenticationFilter

這個需要依賴 spring-scurity-oauth2 相關的模塊。OAuth2 登錄認證過濾器。處理通過 OAuth2 進行認證登錄的邏輯。

3.15 Saml2WebSsoAuthenticationFilter

這個需要用到 Spring Security SAML 模塊,這是一個基于 SMAL 的 SSO 單點登錄認證過濾器。 關于SAML

3.16 UsernamePasswordAuthenticationFilter

這個看過我相關文章的應該不陌生了。處理用戶以及密碼認證的核心過濾器。認證請求提交的username和 password,被封裝成token進行一系列的認證,便是主要通過這個過濾器完成的,在表單認證的方法中,這是最最關鍵的過濾器。

你可以通過 HttpSecurity#formLogin() 及相關方法引入其配置對象 FormLoginConfigurer 來進行配置。 我們在 Spring Security 實戰干貨: 玩轉自定義登錄 已經對其進行過個性化的配置和魔改。

3.17 ConcurrentSessionFilter

參見 3.2 ConcurrentSessionFilter 。 該過濾器可能會被多次執行。

3.18 OpenIDAuthenticationFilter

基于OpenID 認證協議的認證過濾器。 你需要在依賴中依賴額外的相關模塊才能啟用它。

3.19 DefaultLoginPageGeneratingFilter

生成默認的登錄頁。默認 /login 。

3.20 DefaultLogoutPageGeneratingFilter

生成默認的退出頁。 默認 /logout 。

3.21 ConcurrentSessionFilter

參見 3.2 ConcurrentSessionFilter 。 該過濾器可能會被多次執行。

3.23 DigestAuthenticationFilter

Digest身份驗證是 Web 應用程序中流行的可選的身份驗證機制 。DigestAuthenticationFilter 能夠處理 HTTP 頭中顯示的摘要式身份驗證憑據。你可以通過 HttpSecurity#addFilter() 來啟用和配置相關功能。

3.24 BasicAuthenticationFilter

和Digest身份驗證一樣都是Web 應用程序中流行的可選的身份驗證機制 。 BasicAuthenticationFilter 負責處理 HTTP 頭中顯示的基本身份驗證憑據。這個 Spring Security 的 Spring Boot 自動配置默認是啟用的 。

BasicAuthenticationFilter 通過 HttpSecurity#httpBasic() 及相關方法引入其配置對象 HttpBasicConfigurer 來進行配置。

3.25 RequestCacheAwareFilter

用于用戶認證成功后,重新恢復因為登錄被打斷的請求。當匿名訪問一個需要授權的資源時。會跳轉到認證處理邏輯,此時請求被緩存。在認證邏輯處理完畢后,從緩存中獲取最開始的資源請求進行再次請求。

RequestCacheAwareFilter 通過 HttpScurity#requestCache() 及相關方法引入其配置對象 RequestCacheConfigurer 來進行配置。

3.26 SecurityContextHolderAwareRequestFilter

用來 實現j2ee中 Servlet Api 一些接口方法, 比如 getRemoteUser 方法、isUserInRole 方法,在使用 Spring Security 時其實就是通過這個過濾器來實現的。

SecurityContextHolderAwareRequestFilter 通過 HttpSecurity.servletApi() 及相關方法引入其配置對象 ServletApiConfigurer 來進行配置。

3.27 JaasApiIntegrationFilter

適用于JAAS (Java 認證授權服務)。 如果 SecurityContextHolder 中擁有的 Authentication 是一個 JaasAuthenticationToken,那么該 JaasApiIntegrationFilter 將使用包含在 JaasAuthenticationToken 中的 Subject 繼續執行 FilterChain。

3.28 RememberMeAuthenticationFilter

處理 記住我 功能的過濾器。

RememberMeAuthenticationFilter 通過 HttpSecurity.rememberMe() 及相關方法引入其配置對象 RememberMeConfigurer 來進行配置。

3.29 AnonymousAuthenticationFilter

匿名認證過濾器。對于 Spring Security 來說,所有對資源的訪問都是有 Authentication 的。對于無需登錄(UsernamePasswordAuthenticationFilter )直接可以訪問的資源,會授予其匿名用戶身份。

AnonymousAuthenticationFilter 通過 HttpSecurity.anonymous() 及相關方法引入其配置對象 AnonymousConfigurer 來進行配置。

3.30 SessionManagementFilter

Session 管理器過濾器,內部維護了一個 SessionAuthenticationStrategy 用于管理 Session 。

SessionManagementFilter 通過 HttpScurity#sessionManagement() 及相關方法引入其配置對象 SessionManagementConfigurer 來進行配置。

3.31 ExceptionTranslationFilter

主要來傳輸異常事件,還記得之前我們見過的 DefaultAuthenticationEventPublisher 嗎?

3.32 FilterSecurityInterceptor

這個過濾器決定了訪問特定路徑應該具備的權限,訪問的用戶的角色,權限是什么?訪問的路徑需要什么樣的角色和權限?這些判斷和處理都是由該類進行的。如果你要實現動態權限控制就必須研究該類 。

3.33 SwitchUserFilter

SwitchUserFilter 是用來做賬戶切換的。默認的切換賬號的url為/login/impersonate,默認注銷切換賬號的url為/logout/impersonate,默認的賬號參數為username 。

你可以通過此類實現自定義的賬戶切換。

4. 總結

所有內置的 31個過濾器作用都講解完了,有一些默認已經啟用。有一些需要引入特定的包并且對 HttpSecurity 進行配置才會生效 。而且它們的順序是既定的。 只有你了解這些過濾器你才能基于業務深度定制 Spring Security 。

到此這篇關于全面解析Spring Security 內置 Filter的文章就介紹到這了,更多相關Spring Security 內置 Filter內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
免费在线亚洲| 国产专区精品| 99精品在线观看| 日韩成人亚洲| 九一精品国产| 亚洲深深色噜噜狠狠爱网站 | 蜜臀国产一区二区三区在线播放| 精品亚洲美女网站| 女人av一区| 美女精品在线| 国产午夜精品一区在线观看| 成人国产精选| 日韩视频精品在线观看| 免费观看久久久4p| 国产精品国码视频| av在线日韩| 少妇精品在线| 久久香蕉网站| 欧美日韩国产高清电影| 日韩精品91亚洲二区在线观看| 麻豆久久久久久| 国产一区日韩一区| 欧美视频久久| 美女国产精品久久久| 亚洲a一区二区三区| 亚洲精品无吗| 日韩精品电影| 日韩精品91亚洲二区在线观看| 精品一区二区三区亚洲| 欧美精品激情| 精品日韩在线| 日韩精品一区二区三区中文| 四虎8848精品成人免费网站| 久久亚洲色图| 免费福利视频一区二区三区| 亚洲精品无播放器在线播放| 精品国产亚洲一区二区三区| 亚洲欧美日韩国产| 欧美激情视频一区二区三区在线播放| 九九久久婷婷| 蜜桃av.网站在线观看| 国产精品99精品一区二区三区∴| 亚洲一区二区三区高清| 欧美日韩在线播放视频| 国产一区二区三区免费在线| 91亚洲精品在看在线观看高清| 国产精品普通话对白| 亚洲天堂成人| 国产一区二区三区成人欧美日韩在线观看| 中文字幕av亚洲精品一部二部 | 国精品产品一区| 日本精品另类| 日韩精品久久久久久| 黄色成人91| 91精品国产乱码久久久久久久| 国产精品黄色| 精品视频在线你懂得| 精品一区二区三区亚洲| 国产午夜精品一区在线观看| 亚洲精品系列| 亚洲精品字幕| 日韩激情网站| 欧美亚洲色图校园春色| 日韩av成人高清| 日韩在线a电影| 亚洲精选成人| 亚洲欧美一级| 91亚洲精品在看在线观看高清 | 视频一区中文| 亚洲精品小说| 99亚洲精品| 另类亚洲自拍| 日韩欧美激情| 国产精品久久| 日韩欧美1区| 欧美日韩中文一区二区| 欧美在线资源| 亚洲精品四区| 7777精品| 97精品国产| 99香蕉国产精品偷在线观看| 日韩欧美激情电影| 麻豆国产精品一区二区三区| 国产理论在线| 99国产精品久久久久久久| 亚洲一二av| 麻豆精品一区二区综合av| 久久电影tv| 免费在线观看成人| 免费在线观看一区| 蜜桃tv一区二区三区| 亚洲毛片在线| 日韩深夜视频| 欧美特黄一区| 国产精品一区高清| 激情久久久久久| 国产精品第一国产精品| 91精品国产福利在线观看麻豆| 中文字幕乱码亚洲无线精品一区| 国产精品99一区二区| 久久福利一区| 欧美成人高清| 91精品国产福利在线观看麻豆| 国产一区二区三区四区五区传媒| 日本久久二区| 亚洲另类黄色| 亚洲字幕久久| 99精品在线观看| 石原莉奈一区二区三区在线观看| 国产精品观看| 日本不卡一二三区黄网| 国产一区二区三区四区二区 | 日韩精品中文字幕吗一区二区| 欧美不卡高清一区二区三区| 日本精品另类| 亚洲另类av| 亚洲精品网址| 久久婷婷亚洲| 日本不卡免费高清视频在线| 91成人小视频| 日韩激情一区二区| 伊人精品一区| 欧美freesex黑人又粗又大| 国产劲爆久久| 欧美片第1页综合| 视频一区日韩| 日韩一区二区三免费高清在线观看| 欧美成人综合| 久久亚洲国产| 久久人人99| 午夜免费一区| 国产精品日本| 美国欧美日韩国产在线播放| 久久国产福利| 综合一区在线| 日韩不卡一区二区三区| 夜夜精品视频| 免费看黄色91| 91伊人久久| 麻豆视频观看网址久久| 久久在线91| 日韩免费小视频| 中文亚洲免费| 日韩精品欧美大片| 国产毛片精品久久| 国际精品欧美精品| 激情婷婷亚洲| 日韩一区二区三免费高清在线观看| 日韩一区二区三区精品| 国产精品**亚洲精品| 国产一区二区精品久| 国产一区二区三区四区二区| 1000部精品久久久久久久久| 视频一区视频二区中文字幕| 国产视频一区二| 日韩一区电影| 在线精品国产亚洲| 国产一区二区三区日韩精品| 欧美日韩国产传媒| 国产午夜久久av| 国产精品91一区二区三区| 日韩一区二区三免费高清在线观看 | 国产精品一区二区三区av麻| 国产成人精品999在线观看| 五月综合激情| 国产精品极品| 快she精品国产999| 国产成人精品一区二区三区视频| 影院欧美亚洲| 九九99久久精品在免费线bt| 亚洲女同中文字幕| 欧美亚洲免费| 久久理论电影| 91视频一区| 久久精品一区二区国产| 午夜电影一区| 亚洲欧美网站| 久久美女精品| 日韩精品一区二区三区免费观看| 国产精品久久久久久久久久妞妞| 蜜桃91丨九色丨蝌蚪91桃色| 久久视频精品| 欧美日一区二区| 私拍精品福利视频在线一区| 精品一区二区三区视频在线播放| 亚洲深深色噜噜狠狠爱网站| 成人精品久久| 久久一区二区三区喷水| 国产精品成人3p一区二区三区| 黄色国产精品| 黄在线观看免费网站ktv| 国产一卡不卡| 爽爽淫人综合网网站| 黑人精品一区| 精品亚洲精品| 国产精品一区二区三区四区在线观看| 中文字幕在线官网| 欧美精品三级在线| 亚洲精品三级| 亚洲小说春色综合另类电影|