亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

Spring Security 整體架構(gòu)

前提

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

整體架構(gòu)

Servlet 整體的過(guò)濾器模型

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

Security 過(guò)濾器鏈

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

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

就更好理解了。

自定義過(guò)濾器

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

但不是所有過(guò)濾器默認(rèn)都開(kāi)啟了的。

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

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

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

實(shí)際開(kāi)發(fā)解決方案

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

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

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

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

一個(gè)替代cookie認(rèn)證的filter

提供一個(gè)簡(jiǎn)單實(shí)現(xiàn),具體業(yè)務(wù)邏輯,開(kāi)發(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ù)抽時(shí)間再整理整理

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

相關(guān)文章

  • Java中的線程中斷機(jī)制和LockSupport詳解

    Java中的線程中斷機(jī)制和LockSupport詳解

    這篇文章主要介紹了Java中的線程中斷機(jī)制和LockSupport詳解,在Java中沒(méi)有辦法立即停止一條線程,然而停止線程卻顯得尤為重要,如取消一個(gè)耗時(shí)操作,因此,Java提供了一種用于停止線程的協(xié)商機(jī)制中斷,也即中斷標(biāo)識(shí)協(xié)商機(jī)制,需要的朋友可以參考下
    2023-09-09
  • 基于mybatis like %%的問(wèn)題

    基于mybatis like %%的問(wèn)題

    這篇文章主要介紹了mybatis like %%的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java上傳文件到服務(wù)器指定文件夾實(shí)現(xiàn)過(guò)程圖解

    Java上傳文件到服務(wù)器指定文件夾實(shí)現(xiàn)過(guò)程圖解

    這篇文章主要介紹了Java上傳文件到服務(wù)器指定文件夾實(shí)現(xiàn)過(guò)程圖解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • 簡(jiǎn)單實(shí)現(xiàn)java上傳圖片文件功能

    簡(jiǎn)單實(shí)現(xiàn)java上傳圖片文件功能

    這篇文章主要教大家如何簡(jiǎn)單實(shí)現(xiàn)java上傳圖片文件功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • String與Blob互轉(zhuǎn)和file文件與Blob互轉(zhuǎn)方式

    String與Blob互轉(zhuǎn)和file文件與Blob互轉(zhuǎn)方式

    這篇文章主要介紹了String與Blob互轉(zhuǎn)和file文件與Blob互轉(zhuǎn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • spring聲明式事務(wù)解析

    spring聲明式事務(wù)解析

    這篇文章主要為大家詳細(xì)介紹了spring聲明式事務(wù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • Spring中的循環(huán)依賴(lài)詳解

    Spring中的循環(huán)依賴(lài)詳解

    這篇文章主要介紹了Spring中的循環(huán)依賴(lài)詳解,  Spring 框架是一個(gè)流行的Java應(yīng)用程序框架,它提供了許多強(qiáng)大的功能,如依賴(lài)注入和面向切面編程,然而在使用 Spring 框架時(shí),我們可能會(huì)遇到循環(huán)依賴(lài)的問(wèn)題,需要的朋友可以參考下
    2023-09-09
  • javaweb中ajax請(qǐng)求后臺(tái)servlet(實(shí)例)

    javaweb中ajax請(qǐng)求后臺(tái)servlet(實(shí)例)

    下面小編就為大家?guī)?lái)一篇javaweb中ajax請(qǐng)求后臺(tái)servlet(實(shí)例)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • 一文帶你學(xué)習(xí)Java多維數(shù)組的使用技巧

    一文帶你學(xué)習(xí)Java多維數(shù)組的使用技巧

    Java作為一門(mén)廣泛應(yīng)用于各行各業(yè)的開(kāi)發(fā)語(yǔ)言,具有豐富的數(shù)據(jù)類(lèi)型支持,其中多維數(shù)組是其重要的一種,多維數(shù)組可以更加方便地組織數(shù)據(jù),提高Java應(yīng)用程序的效率,本文將為大家介紹Java中多維數(shù)組的基本概念和常用操作,助力讀者更好地掌握多維數(shù)組的使用技巧
    2023-11-11
  • Java的invoke方法的具體使用

    Java的invoke方法的具體使用

    本文主要介紹了Java的invoke方法的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07

最新評(píng)論