最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring Security  整體架構(gòu)操作流程

 更新時間:2024年07月03日 10:36:22   作者:01空間  
這篇文章主要介紹了Spring Security  整體架構(gòu)操作流程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧

Spring Security 整體架構(gòu)

前提

開源項目一手文檔基本都在github,標準文檔基本都在官網(wǎng)。
最好的文檔就是官網(wǎng);
在前些年,Apache下還有個比較流行的權(quán)限框架 Shiro,但是隨著Spring Security (以下簡稱 Security)的流行,逐漸邊緣化。其實這類框架整體設(shè)計都大差不差,都是基于一系列的過濾器或者其他攔截手段實現(xiàn)增強。

整體架構(gòu)

Servlet 整體的過濾器模型

這一塊屬于 Servlet 基礎(chǔ),過濾器算是Servlet核心功能之一,需重點掌握。

Security 過濾器鏈

Security 在 Servlet 過濾器上定義了一個 自己的過濾器(這個過濾器使用了委托者設(shè)計模式)

可以看到,Servlet 過濾器鏈上,不僅有 Security 的過濾器還有 Spring Boot 的一些過濾器,但是這里我們重點關(guān)注圈起來的那個過濾器(鏈)
再對比官方的這個圖

就更好理解了。

自定義過濾器

我們自定義的過濾器基本都是在 Security 這個過濾器鏈上面的,通過編排不同的順序,實現(xiàn)想要的功能。
在這之前,我們先看看Security默認的過濾器鏈上有哪些過濾器官方列表
這里為了照顧,訪問不了官網(wǎng)的,簡單截個圖。

但不是所有過濾器默認都開啟了的。

上面那個鏈是,Spring 全局的過濾器鏈,里面第四個過濾器委托給了下面那個 Security 的過濾器鏈,在 Security 的過濾器鏈中,可以看到默認有14個過濾器。
其中有幾個重點關(guān)注的是:

  • SecurityContextPersistenceFilter (即將過時,替代者為 SecurityContextHolderFilter),其功能為,支持默認的基于 Cookie 的登錄形式;
  • 對于新接觸認證授權(quán)的開發(fā)者,要明白一點,不管什么實現(xiàn)方案,每一次進行鑒權(quán),其本質(zhì)會進行一次登錄認證,只是方式不同而已LogoutFilter 注銷登錄的過濾器,默認的url為 /logout,要實現(xiàn)自定義退出可以參考
  • UsernamePasswordAuthenticationFilter 大部分開發(fā)者,開始接觸 Security 都是模仿這個 過濾器實現(xiàn)的自定義登錄
  • AnonymousAuthenticationFilter 在 Security 中,認證沒有通過或者沒有匹配上認證過濾器的請求,最終會被定義為匿名認證,這也是一種認證結(jié)果,在權(quán)限中也有相關(guān)的配置。

其他的過濾器根據(jù)自己的需求,調(diào)整。

實際開發(fā)解決方案

在實際開發(fā)中,目前通常采用前后端分離的形式;有的前端對Cookie 不太友好;因此,為了統(tǒng)一,大部分開發(fā)者會采用 header 認證方式。
這樣實現(xiàn)起碼會有兩個點需要調(diào)整

1.調(diào)整默認認證成功的處理方式
默認配置下,認證成功會跳轉(zhuǎn)到一個指定的頁面;現(xiàn)在大多會把這個跳轉(zhuǎn)交給前端。

2.改為header 傳遞認證參數(shù)后,默認的過濾器就不支持了,需要定義一個 過濾器,解析header,并進行認證;個人推薦將這個認證過濾器放在
AnonymousAuthenticationFilter 的前面,因為前面還有些其他認證過濾器,如果自定義的過濾器太靠前,可能會被其他認證過濾器(比如上面提到的 SecurityContextPersistenceFilter 以及 SecurityContextHolderFilter)給覆蓋掉認證信息,當然這要取決實際的優(yōu)先級,萬一你就想自定義的認證認證過濾器優(yōu)先級低一點呢

可以看到,這兩個認證過濾器不管你是否已經(jīng)認證,會直接覆蓋掉認證信息。

一個替代cookie認證的filter

提供一個簡單實現(xiàn),具體業(yè)務(wù)邏輯,開發(fā)者自己填充

package authorization.filter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.util.StringUtils;
import org.springframework.web.filter.OncePerRequestFilter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Collections;
public class JwtAuthenticationFilter extends OncePerRequestFilter {
	private final Logger logger = LoggerFactory.getLogger(JwtAuthenticationFilter.class);
	@Override
	protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
			throws ServletException, IOException {
		String token = request.getHeader("token");
		if (!StringUtils.hasText(token)) {
			filterChain.doFilter(request, response);
			return;
		}
		try {
			UsernamePasswordAuthenticationToken authenticationToken
					= UsernamePasswordAuthenticationToken.authenticated("zhangsan", "zs", Collections.emptyList());
			SecurityContext context = SecurityContextHolder.createEmptyContext();
			context.setAuthentication(authenticationToken);
			SecurityContextHolder.setContext(context);
			filterChain.doFilter(request, response);
		}
		finally {
			SecurityContextHolder.clearContext();
		}
	}
	@Override
	protected boolean shouldNotFilterErrorDispatch() {
		return true;
	}
}

其他組件,后續(xù)抽時間再整理整理

到此這篇關(guān)于Spring Security 整體架構(gòu)的文章就介紹到這了,更多相關(guān)Spring Security 整體架構(gòu)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java使用BouncyCastle加密

    Java使用BouncyCastle加密

    本文主要介紹了Java使用BouncyCastle加密,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • Java繼承概念詳細解讀

    Java繼承概念詳細解讀

    這篇文章主要介紹了Java繼承概念詳細解讀,涉及繼承的概念,合成的語法等相關(guān)內(nèi)容,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • Flink支持哪些數(shù)據(jù)類型?

    Flink支持哪些數(shù)據(jù)類型?

    Apache Flink 以其獨特的方式來處理數(shù)據(jù)類型以及序列化,這種方式包括它自身的類型描述符、泛型類型提取以及類型序列化框架.本文檔描述了它們背后的概念和基本原理,需要的朋友可以參考下
    2021-06-06
  • Java項目五種創(chuàng)建方式示例總結(jié)

    Java項目五種創(chuàng)建方式示例總結(jié)

    這篇文章主要介紹了Java項目五種創(chuàng)建方式的相關(guān)資料,包括普通Java項目、JavaWeb項目(Servlet/JSP)、Maven項目、MavenWeb項目和SpringBoot項目,每種項目類型都有其特定的用途、典型目錄結(jié)構(gòu)、如何創(chuàng)建項目、核心配置、依賴管理和優(yōu)缺點,需要的朋友可以參考下
    2026-01-01
  • SpringBoot整合mybatis簡單案例過程解析

    SpringBoot整合mybatis簡單案例過程解析

    這篇文章主要介紹了SpringBoot整合mybatis簡單案例過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • SpringBoot返回所有接口詳細信息的方法詳解

    SpringBoot返回所有接口詳細信息的方法詳解

    這篇文章主要介紹了SpringBoot返回所有接口詳細信息的方法,簡單來說就是我們通過訪問一個接口能看到我們所有的API接口的數(shù)量,以及路徑和請求方法,文中有詳細的代碼供大家參考,需要的朋友可以參考下
    2025-04-04
  • Java線程基本使用之如何實現(xiàn)Runnable接口

    Java線程基本使用之如何實現(xiàn)Runnable接口

    這篇文章主要介紹了Java線程基本使用之如何實現(xiàn)Runnable接口問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • spring mvc 組合mybatis框架實例詳解

    spring mvc 組合mybatis框架實例詳解

    本項目采用 maven 結(jié)構(gòu),主要演示了 spring mvc + mybatis,controller 獲取數(shù)據(jù)后以json 格式返回數(shù)據(jù)。對spring mvc 組合mybatis的方法感興趣的朋友可以參考下本文
    2018-01-01
  • 一文搞懂設(shè)計模式中的單例模式

    一文搞懂設(shè)計模式中的單例模式

    這篇文章主要介紹了一文搞懂設(shè)計模式中的單例模式,單例模式是最簡單的設(shè)計模式之一,屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的方式,確保只有單個對象被創(chuàng)建,需要的朋友可以參考下
    2023-08-08
  • SpringBoot 2 快速整合 Filter過程解析

    SpringBoot 2 快速整合 Filter過程解析

    這篇文章主要介紹了SpringBoot 2 快速整合 Filter過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-09-09

最新評論

南川市| 北碚区| 土默特右旗| 顺昌县| 秀山| 屯留县| 集贤县| 长汀县| 公主岭市| 逊克县| 海淀区| 岳普湖县| 甘南县| 西贡区| 肃宁县| 昌都县| 石屏县| 沈丘县| 新昌县| 宁晋县| 道孚县| 临海市| 堆龙德庆县| 阜平县| 翁源县| 呼伦贝尔市| 皮山县| 安徽省| 开远市| 宁化县| 大城县| 泰和县| 尚义县| 临清市| 云南省| 鄂尔多斯市| 合山市| 米泉市| 兴安盟| 资溪县| 安龙县|