最近中文字幕高清中文字幕无,亚洲欧美高清一区二区三区,一本色道无码道dvd在线观看 ,一个人看的www免费高清中文字幕

首頁(yè) 慕課教程 Spring Security Spring Security Spring Security 安全過(guò)濾器

Spring Security 安全過(guò)濾器

1. 前言

上一節(jié)中我們了解到了 Spring Security 安全框架是由一系列有序的安全過(guò)濾器組成的,本節(jié)將重點(diǎn)討論 Spring Security 內(nèi)置安全過(guò)濾器的順序及含義。

Spring 將自己體系內(nèi)的過(guò)濾器交由「過(guò)濾器代理 FilterChainProxy」管理,Spring Security 在「過(guò)濾器代理 FilterChainProxy」中加入了「安全過(guò)濾器鏈 SecurityFilterChain」實(shí)現(xiàn)安全保護(hù)功能。

在 Spring Security 各個(gè)模塊中,內(nèi)置已實(shí)現(xiàn)了一系列的「安全過(guò)濾器」,可以滿足常見(jiàn)的認(rèn)證、鑒權(quán)等功能需求。

在 Spring Security 5.3.2 中,共內(nèi)置了 33 個(gè)安全過(guò)濾器。

本節(jié)主要討論 Spring Security 內(nèi)置的安全過(guò)濾器。

2. 內(nèi)置安全過(guò)濾器

2.1 內(nèi)置安全過(guò)濾器的聲明

Spring Security 中的 SecurityFilterChain 對(duì)象,是通過(guò) HttpSecurity 類來(lái)使用,它還提供了安全過(guò)濾器增、減的調(diào)用接口。

如前文所述,安全過(guò)濾器的執(zhí)行順序是至關(guān)重要的,而順序的確定是由 FilterComparator 對(duì)象實(shí)現(xiàn)的。

FilterComparator 類的全路徑為 org.springframework.security.config.annotation.web.builders.FilterComparator

在其構(gòu)造的時(shí)候配置了過(guò)濾器的基本順序,代碼如下:

FilterComparator() {
  FilterComparator.Step order = new FilterComparator.Step(100, 100);
  this.put(ChannelProcessingFilter.class, order.next());
  this.put(ConcurrentSessionFilter.class, order.next());
  this.put(WebAsyncManagerIntegrationFilter.class, order.next());
  this.put(SecurityContextPersistenceFilter.class, order.next());
  this.put(HeaderWriterFilter.class, order.next());
...
  this.put(SessionManagementFilter.class, order.next());
  this.put(ExceptionTranslationFilter.class, order.next());
  this.put(FilterSecurityInterceptor.class, order.next());
  this.put(SwitchUserFilter.class, order.next());
}

注意,以上 FilterComparator 中的定義僅作為內(nèi)置過(guò)濾器排序的依據(jù),并不等于過(guò)濾器的真正注入。

除了內(nèi)置的過(guò)濾器外,當(dāng)我們需要添加自定義過(guò)濾器的時(shí)候,也需要依賴 FilterComparator 對(duì)象完成順序的配置。實(shí)際開(kāi)發(fā)時(shí)可用以下方法完成向指定順位插入過(guò)濾器的功能:http.addFilterAfter、http.addFilterBefore、http.addFilter、http.addFilterAthttpHttpSecurity 實(shí)例)。

另一方面,HttpSecurity 還為各個(gè)內(nèi)置過(guò)濾器提供了配置接口。例如:針對(duì) HeaderWriterFilter 提供了 headers() 方法,用于獲取或?yàn)?HeaderWriterFilter 配置參數(shù),例如設(shè)置響應(yīng)緩存時(shí)效 Expires 等 。HttpSecurity 在構(gòu)建時(shí),會(huì)根據(jù)已有的配置信息逐一對(duì) Filter 進(jìn)行實(shí)例化。HttpSecurity 還完成了對(duì)請(qǐng)求地址的配置,通過(guò) RequestMatcherConfigurer 對(duì)象使請(qǐng)求地址與 Filter 匹配。

2.2 內(nèi)置過(guò)濾器總覽

圖片描述

內(nèi)容過(guò)濾器總覽
Spring Security 內(nèi)置了 33 種安全過(guò)濾器,其順序、名稱及作用如下表所示:
順序號(hào) 過(guò)濾器名稱 簡(jiǎn)述
1 ChannelProcessingFilter 檢查 web 請(qǐng)求通道,如:http、https
2 ConcurrentSessionFilter 檢查 Session 狀態(tài),更新 Session 最后訪問(wèn)時(shí)間
3 WebAsyncManagerIntegrationFilter 關(guān)聯(lián) Spring Web 上下文和 Spring Security 上下文
4 SecurityContextPersistenceFilter 從 Session 構(gòu)建 SecurityContext
5 HeaderWriterFilter 往請(qǐng)求頭或響應(yīng)頭里寫(xiě)入信息
6 CorsFilter 跨域請(qǐng)求頭
7 CsrfFilter 跨站請(qǐng)求偽造
8 LogoutFilter 注銷過(guò)濾器
9 OAuth2AuthorizationRequestRedirectFilter OAuth2 請(qǐng)求重定向
10 Saml2WebSsoAuthenticationRequestFilter SAML2 單點(diǎn)登錄認(rèn)證請(qǐng)求過(guò)濾器
11 X509AuthenticationFilter X509 認(rèn)證過(guò)濾器
12 AbstractPreAuthenticatedProcessingFilter 預(yù)認(rèn)證處理
13 CasAuthenticationFilter 單點(diǎn)認(rèn)證過(guò)濾器
14 OAuth2LoginAuthenticationFilter OAuth2 認(rèn)證過(guò)濾器
15 Saml2WebSsoAuthenticationFilter SAML2 單點(diǎn)登錄認(rèn)證過(guò)濾器
16 UsernamePasswordAuthenticationFilter 用戶名密碼認(rèn)證過(guò)濾器
17 ConcurrentSessionFilter 檢查 Session 狀態(tài),更新 Session 最后訪問(wèn)時(shí)間。第二次出現(xiàn)。
18 OpenIDAuthenticationFilter Open ID 認(rèn)證過(guò)濾器
19 DefaultLoginPageGeneratingFilter 生成 /login 頁(yè)面
20 DefaultLogoutPageGeneratingFilter 生成 /logout 頁(yè)面
21 DigestAuthenticationFilter 數(shù)字簽名認(rèn)證過(guò)濾器
22 BearerTokenAuthenticationFilter Bearer Token 認(rèn)證過(guò)濾器
23 BasicAuthenticationFilter 基本身份認(rèn)證過(guò)濾器
24 RequestCacheAwareFilter 緩存請(qǐng)求狀態(tài)過(guò)濾器
25 SecurityContextHolderAwareRequestFilter 安全上下文請(qǐng)求輔助過(guò)濾器
26 JaasApiIntegrationFilter JAAS 認(rèn)證授權(quán)過(guò)濾器
27 RememberMeAuthenticationFilter 實(shí)現(xiàn)記住我功能
28 AnonymousAuthenticationFilter 匿名認(rèn)證過(guò)濾器
29 OAuth2AuthorizationCodeGrantFilter OAuth2 認(rèn)證授權(quán)碼
30 SessionManagementFilter 管理 Session
31 ExceptionTranslationFilter 異常事件處理過(guò)濾器
32 FilterSecurityInterceptor 動(dòng)態(tài)權(quán)限配置
33 SwitchUserFilter 切換賬戶

2.3 常用內(nèi)置過(guò)濾器的具體說(shuō)明

內(nèi)置過(guò)濾器的參數(shù)設(shè)置通過(guò) HttpSecurity 相應(yīng)的配置方法完成。

2.3.1 ChannelProcessingFilter

ChannelProcessingFilter 的用于檢測(cè)請(qǐng)求的通道,例如 HttpHttps 等,可以實(shí)現(xiàn)訪問(wèn)請(qǐng)求在不同通道間的跳轉(zhuǎn)。

ChannelProcessingFilter 的配置通過(guò) HttpSecurity.requiresChannel() 方法獲取。

例如:強(qiáng)制使用 Https 通道訪問(wèn)。

http.requiresChannel().antMatchers("/users").requiresSecure();

2.3.2 ConcurrentSessionFilter

此過(guò)濾器在默認(rèn)情況下出現(xiàn)兩次,其工作內(nèi)容大致分兩步:

  1. 判斷 Session 是否存在,如果存在則獲取,否則結(jié)束;
  2. 判斷 Session 是否過(guò)期,如果過(guò)期則執(zhí)行退出操作,否則更新 Session 時(shí)間。

ConcurrentSessionFilter 的配置通過(guò) HttpSecurity.sessionManagement() 方法獲取。

例如:設(shè)置 Session 無(wú)效時(shí)的跳轉(zhuǎn) URL。

http.sessionManagement().invalidSessionUrl("/login");

2.3.3 WebAsyncManagerIntegrationFilter

WebAsyncManagerIntegrationFilter 用于關(guān)聯(lián) SecurityContext 上下文。

此過(guò)濾器無(wú)配置公布的方法。

2.3.4 SecurityContextPersistenceFilter

SecurityContextPersistenceFilter 用于從 Session 構(gòu)建 SecurityContext。具體分為兩步:

  1. 請(qǐng)求開(kāi)始時(shí),將 SecurityContextRepository 中的 SecurityContext 對(duì)象存入 SecurityContextHolder;
  2. 請(qǐng)求完成時(shí),清理 SecurityContextHolder 中的 SecurityContext 對(duì)象,并產(chǎn)生新的 SecurityContext 對(duì)象放入到 SecurityContextRepository 中,以保證并發(fā)環(huán)境下的數(shù)據(jù)一致性。

SecurityContextPersistenceFilter 的配置通過(guò) HttpSecurity.securityContext() 方法獲取。

2.3.5 HeaderWriterFilter

HeaderWriterFilter 用于往請(qǐng)求頭或響應(yīng)頭里寫(xiě)入信息。

HeaderWriterFilter 的配置通過(guò) HttpSecurity.headers() 方法獲取。默認(rèn)支持的 Header 包括:

Header [name: X-Content-Type-Options, values: [nosniff]]
Header [name: X-XSS-Protection, values: [1; mode=block]]
Header [name: Cache-Control, values: [no-cache, no-store, max-age=0, must-revalidate]]
Header [name: Pragma, values: [no-cache]]
Header [name: Expires, values: [0]]

2.3.6 CorsFilter

CorsFilter 用于配置跨域請(qǐng)求策略。當(dāng)一個(gè)請(qǐng)求中,來(lái)源與目標(biāo)的協(xié)議、主機(jī)名、端口三者任一不同,即為跨域,在實(shí)際開(kāi)發(fā)中如果遇到類似 header is present on the requested resource. 的錯(cuò)誤時(shí),往往是因?yàn)榭缬蚺渲貌徽_導(dǎo)致。

CorsFilter 的配置通過(guò) HttpSecurity.cors() 方法獲取。例如,禁用跨域驗(yàn)證:

http.cors().disable();

2.3.7 CsrfFilter

CsrfFilter 用于驗(yàn)證消息來(lái)源,防范跨站請(qǐng)求偽造,此項(xiàng)功能需要前端的配合。

CsrfFilter 的配置通過(guò) HttpSecurity.csrf() 方法獲取。例如,禁用 Csrf:

http.csrf().disable();

2.3.8 LogoutFilter

LogoutFilter 用于注銷登錄狀態(tài)。

LogoutFilter 的配置通過(guò) HttpSecurity.logout() 方法獲取。例如,設(shè)置退出后的跳轉(zhuǎn)頁(yè)面。

http.logout().logoutSuccessUrl("/login");

2.3.9 UsernamePasswordAuthenticationFilter

UsernamePasswordAuthenticationFilter 用于處理用戶名、密碼認(rèn)證。

UsernamePasswordAuthenticationFilter 的配置通過(guò) HttpSecurity.formLogin() 方法獲取。例如,設(shè)置用戶名參數(shù)為「mobile」:

http.formLogin().usernameParameter("mobile")

UsernamePasswordAuthenticationFilter Spring Security 認(rèn)證中較為常用的過(guò)濾器,我們會(huì)在后續(xù)章節(jié)重點(diǎn)展開(kāi)。

2.3.10 ExceptionTranslationFilter

ExceptionTranslationFilter 用于異常事件處理。異常事件有前述過(guò)濾器拋出,異常共分為 2 類,一類是認(rèn)證異常,另一類是權(quán)限異常。

ExceptionTranslationFilter 的配置通過(guò) HttpSecurity.exceptionHandling() 方法獲取。

ExceptionTranslationFilter 同樣較為常用,將在后續(xù)章節(jié)中重點(diǎn)展開(kāi)。

3 增加自定義的 Filter

在 HttpSecurity 對(duì)象中增加自定義 Filter 可用于實(shí)現(xiàn)認(rèn)證方式的擴(kuò)展等場(chǎng)景,擴(kuò)展 Filter 有兩步很重要,第一是實(shí)現(xiàn) javax.servlet.Filter 接口;第二是指定新過(guò)濾器的位置。

例如,擴(kuò)展自定義接口 SimpleFilter。

  1. 自定義接口類
public class SimpleFilter implements Filter {

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("In SimpleFilter");
    }
}
  1. 加入到指定位置,比如加在 UsernamePasswordAuthenticationFilter 之前
http.addFilterBefore(new SimpleFilter(), UsernamePasswordAuthenticationFilter.class);

4. 小結(jié)

本節(jié)我們介紹了 Spring Security 過(guò)濾器的作用及其順序,主要的知識(shí)點(diǎn)有:

  • Spring Security 通過(guò)擴(kuò)展 Spring 過(guò)濾器實(shí)現(xiàn)安全相關(guān)業(yè)務(wù)邏輯;
  • Spring Security 目前原生實(shí)現(xiàn)了 33 個(gè)過(guò)濾器,每個(gè)過(guò)濾器有固定的順序及應(yīng)用場(chǎng)景;
  • Spring Security 可以的插入自定義的過(guò)濾器,并且指定過(guò)濾器的位置。

Spring Security 過(guò)濾器幾乎是所有安全功能的核心,在后續(xù)章節(jié)中還會(huì)圍繞過(guò)濾器展開(kāi)討論。下節(jié)我們將介紹 Spring Security 的異常回收機(jī)制。