第七色在线视频,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 是通過什么方法將安全邏輯應(yīng)用到 Servlet 項(xiàng)目中呢?答案就是 Servlet 的過濾器機(jī)制。

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

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

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

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

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

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

圖片描述

圖1. 過濾器鏈

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

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

圖片描述

圖2. Spring 的過濾器委托代理

4. Spring Security 安全過濾器

4.1 加入安全過濾器

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

圖片描述

圖3. 過濾器鏈代理

4.2 安全過濾器鏈

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

圖片描述

圖4. 安全過濾器鏈

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

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

圖片描述

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

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

5. 小結(jié)

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

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

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