十年網(wǎng)站開(kāi)發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶(hù) + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專(zhuān)業(yè)推廣+無(wú)憂(yōu)售后,網(wǎng)站問(wèn)題一站解決
創(chuàng)新互聯(lián)www.cdcxhl.cn八線(xiàn)動(dòng)態(tài)BGP香港云服務(wù)器提供商,新人活動(dòng)買(mǎi)多久送多久,劃算不套路!
本篇文章和大家了解一下Spring Security內(nèi)置Filter的介紹。有一定的參考價(jià)值,有需要的朋友可以參考一下,希望對(duì)大家有所幫助。
1. 前言
上一文我們使用 Spring Security 實(shí)現(xiàn)了各種登錄聚合的場(chǎng)面。其中我們是通過(guò)在 UsernamePasswordAuthenticationFilter
之前一個(gè)自定義的過(guò)濾器實(shí)現(xiàn)的。我怎么知道自定義過(guò)濾器要加在 UsernamePasswordAuthenticationFilter
之前。我在這個(gè)系列開(kāi)篇說(shuō)了 Spring Security 權(quán)限控制的一個(gè)核心關(guān)鍵就是 過(guò)濾器鏈 ,這些過(guò)濾器如下圖進(jìn)行過(guò)濾傳遞,甚至比這個(gè)更復(fù)雜!這只是一個(gè)最小單元。
Spring Security 內(nèi)置了一些過(guò)濾器,他們各有各的本事。如果你掌握了這些過(guò)濾器,很多實(shí)際開(kāi)發(fā)中的需求和問(wèn)題都很容易解決。今天我們來(lái)見(jiàn)識(shí)一下這些內(nèi)置的過(guò)濾器。
2. 內(nèi)置過(guò)濾器初始化
在 Spring Security 初始化核心過(guò)濾器時(shí) HttpSecurity
會(huì)通過(guò)將 Spring Security 內(nèi)置的一些過(guò)濾器以 FilterComparator
提供的規(guī)則進(jìn)行比較按照比較結(jié)果進(jìn)行排序注冊(cè)。
2.1 排序規(guī)則
FilterComparator
維護(hù)了一個(gè)順序的注冊(cè)表 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.oauth3.client.web.OAuth3AuthorizationRequestRedirectFilter", 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.oauth3.client.web.OAuth3LoginAuthenticationFilter", 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.oauth3.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.oauth3.client.web.OAuth3AuthorizationCodeGrantFilter", order.next()); put(SessionManagementFilter.class, order.next()); put(ExceptionTranslationFilter.class, order.next()); put(FilterSecurityInterceptor.class, order.next()); put(SwitchUserFilter.class, order.next()); }