第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

Spring Security Servlet 安全架構(gòu)

1. 前言

在上一節(jié)中,我們演示了如何快速搭建 Spring Security 項(xiàng)目,本節(jié)將主要討論 Spring Security 安全框架的組成。

在前文中提到,Spring Security 設(shè)計(jì)的 Servlet 安全從架構(gòu)上分為三個(gè)層次,分別是「認(rèn)證」、「鑒權(quán)」、「入侵防護(hù)」。那 Spring Security 是通過(guò)什么方法將安全邏輯應(yīng)用到 Servlet 項(xiàng)目中呢?答案就是 Servlet 的過(guò)濾器機(jī)制。

我們知道,在 Servlet 項(xiàng)目中,請(qǐng)求的接收和處理是通過(guò)一個(gè)一個(gè)的過(guò)濾器順序執(zhí)行實(shí)現(xiàn)的,過(guò)濾器是 Servlet 項(xiàng)目處理請(qǐng)求的基礎(chǔ)。Spring 則通過(guò)委托代理的機(jī)制,將 Servlet 和 Spring 框架的 ApplicationContext 對(duì)象相互連通。Spring Security 借助 Spring 的委托代理插入了安全框架的內(nèi)容。也就是說(shuō),Spring 向 Servlet 工程中插入了一個(gè)自己的過(guò)濾器,用來(lái)擴(kuò)展出 Spring 的各項(xiàng)功能,Spring Security 又向 Spring 中插入了自己的過(guò)濾器,實(shí)現(xiàn)了安全功能。

本節(jié)主要討論 Spring Security 在 Servlet 項(xiàng)目中的實(shí)現(xiàn)思路。

2. Servlet 項(xiàng)目中的過(guò)濾器(Filter)

每當(dāng)客戶(hù)端向 Servlet 服務(wù)端發(fā)起請(qǐng)求,該請(qǐng)求在被 Servlet 執(zhí)行前,會(huì)經(jīng)過(guò)一系列的過(guò)濾器,這些過(guò)濾器有兩個(gè)主要功能:

  1. 阻止后續(xù)過(guò)濾器或者 Servlet 的執(zhí)行;
  2. 修改 HttpServletRequest 或者 HttpServletResponse 的內(nèi)容,提供后續(xù)的過(guò)濾器或者 Servlet 使用。

每一個(gè)過(guò)濾器的作用都是為了影響后續(xù)過(guò)濾器的執(zhí)行,所以 Filter 的執(zhí)行順序非常重要,而決定它們順序關(guān)系的便是過(guò)濾器鏈(Filter Chain)。

圖片描述

圖1. 過(guò)濾器鏈

3. Spring 的過(guò)濾器委托代理機(jī)制

Spring 提供了一個(gè)名為 DelegatingFilterProxy 的過(guò)濾器。這個(gè)過(guò)濾器的作用是連接 Servlet 項(xiàng)目中 Servlet 容器和 Spring 項(xiàng)目的核心上下文對(duì)象(ApplicationContext)。Servlet 容器允許對(duì)其過(guò)濾器做自定義的擴(kuò)展,DelegatingFilterProxy 將 Spring 的 Bean 過(guò)濾器(Bean Filter)插入到 Servlet 的過(guò)濾器鏈中執(zhí)行。

圖片描述

圖2. Spring 的過(guò)濾器委托代理

4. Spring Security 安全過(guò)濾器

4.1 加入安全過(guò)濾器

Spring Security 的 Servlet 支持是通過(guò)過(guò)濾器鏈代理(FilterChainProxy)對(duì)象實(shí)現(xiàn)的。FilterChainProxy 同樣也是一個(gè)過(guò)濾器,被封裝在 Spring 的過(guò)濾器委托代理(DelegatingFilterProxy)中。其過(guò)程如圖:

圖片描述

圖3. 過(guò)濾器鏈代理

4.2 安全過(guò)濾器鏈

安全過(guò)濾器鏈(SecurityFilterChain)用在 FilterChainProxy 上,其作用是覺(jué)得用于處理安全的過(guò)濾器們的執(zhí)行順序。如圖:

圖片描述

圖4. 安全過(guò)濾器鏈

安全過(guò)濾器鏈(SecurityFilterChain)是注冊(cè)在過(guò)濾器鏈代理(FilterChainProxy)上的,有以下幾個(gè)特點(diǎn):

  1. 為所有 Spring Security 支持的 Servlet 指明了起點(diǎn);
  2. 對(duì)于一些后臺(tái)操作,可以提升執(zhí)行效率;
  3. 在 Servlet 容器中,過(guò)濾器的選擇是由 URL 決定的,如此便可針對(duì)不同 URL 指定相互獨(dú)立的安全策略。

圖片描述

圖5. 多個(gè)安全過(guò)濾器鏈代理并存

有時(shí),我們需要對(duì)不同的 URL 做不同的安全處理,就可以通過(guò)加入多個(gè)安全過(guò)濾鏈實(shí)現(xiàn),比如上圖中 SecurityFilterChain0 對(duì) /api/** 請(qǐng)求有 3 個(gè)安全過(guò)濾器處理,SecurityFilterChain1 對(duì) /** 等其他請(qǐng)求有 4 個(gè)安全過(guò)濾器的處理。每一個(gè)安全過(guò)濾器鏈都是獨(dú)立的、唯一的且不會(huì)重復(fù)執(zhí)行的。

5. 小結(jié)

本節(jié)我們介紹了 Spring Security 安全架構(gòu)的設(shè)計(jì)理念,本節(jié)主要知識(shí)點(diǎn)如下:

  • Servlet 項(xiàng)目基于「過(guò)濾器」方式實(shí)現(xiàn)功能擴(kuò)展;
  • Spring 項(xiàng)目擴(kuò)展了「Servlet 過(guò)濾器」,增加了自己的「過(guò)濾器代理」;
  • Spring Security 項(xiàng)目擴(kuò)展了「Spring 過(guò)濾器」,在「Spring 過(guò)濾器代理」中加入了安全過(guò)濾器;
  • Spring Security 項(xiàng)目通過(guò)構(gòu)建一系列的「安全過(guò)濾器」實(shí)現(xiàn)系統(tǒng)的安全保護(hù)能力。

下一節(jié)將討論 Spring Security 中內(nèi)置的過(guò)濾器作用及其順序。