SpringSecurity源码4

news2024/11/16 5:33:07

SecurityContext.class
当前线程关联的最小安全信息,提供Authentication的get/set方法

在这里插入图片描述

SecurityContextHolder.class
SecurityContext的持有器

	// 全部委托给策略类
	public static void setContext(SecurityContext context) {
		strategy.setContext(context);
	}
	public static SecurityContext getContext() {
		return strategy.getContext();
	}
	public static void clearContext() {
		strategy.clearContext();
	}

SecurityContextHolderStrategy.class
用于针对线程存储安全上下文信息的策略。

在这里插入图片描述
核心实现类ThreadLocalSecurityContextHolderStrategy
在这里插入图片描述

ThreadLocalSecurityContextHolderStrategy.class
基于ThreadLocal 的实现SecurityContextHolderStrategy。
在这里插入图片描述

回到SecurityContextHolder.class方法

	static {
		initialize();
	}

	private static void initialize() {
		initializeStrategy();
		initializeCount++;
	}
	
	private static void initializeStrategy() {
		if (MODE_PRE_INITIALIZED.equals(strategyName)) {
			Assert.state(strategy != null, "When using " + MODE_PRE_INITIALIZED
					+ ", setContextHolderStrategy must be called with the fully constructed strategy");
			return;
		}
		// 默认的话就是上文提到的ThreadLocalSecurityContextHolderStrategy
		if (!StringUtils.hasText(strategyName)) {
			// Set default
			strategyName = MODE_THREADLOCAL;
		}
		if (strategyName.equals(MODE_THREADLOCAL)) {
			strategy = new ThreadLocalSecurityContextHolderStrategy();
			return;
		}
		if (strategyName.equals(MODE_INHERITABLETHREADLOCAL)) {
			strategy = new InheritableThreadLocalSecurityContextHolderStrategy();
			return;
		}
		if (strategyName.equals(MODE_GLOBAL)) {
			strategy = new GlobalSecurityContextHolderStrategy();
			return;
		}
		// Try to load a custom strategy
		try {
			Class<?> clazz = Class.forName(strategyName);
			Constructor<?> customStrategy = clazz.getConstructor();
			strategy = (SecurityContextHolderStrategy) customStrategy.newInstance();
		}
		catch (Exception ex) {
			ReflectionUtils.handleReflectionException(ex);
		}
	}

SecurityContextRepository.class
用于在请求之间持久保存的策略 SecurityContext
可以通过redis实现单点登录问题

public interface SecurityContextRepository {

	// 废弃
	@Deprecated
	SecurityContext loadContext(HttpRequestResponseHolder requestResponseHolder);

	
	default Supplier<SecurityContext> loadContext(HttpServletRequest request) {
		return SingletonSupplier.of(() -> loadContext(new HttpRequestResponseHolder(request, null)));
	}

	void saveContext(SecurityContext context, HttpServletRequest request, HttpServletResponse response);

	boolean containsContext(HttpServletRequest request);

}

SecurityContextHolderFilter.class
使用 获取 SecurityContextRepository SecurityContext 并将其设置在 SecurityContextHolder上的 的 。javax.servlet.Filter这与 类似SecurityContextPersistenceFilter,只是必须显式调用 来SecurityContextRepository.saveContext(SecurityContext, HttpServletRequest, HttpServletResponse)保存 SecurityContext.这提高了效率,并通过允许不同的身份验证机制单独选择是否应保留身份验证来提供更好的灵活性。



public class SecurityContextHolderFilter extends OncePerRequestFilter {

	private final SecurityContextRepository securityContextRepository;

	private boolean shouldNotFilterErrorDispatch;

	/**
	 * Creates a new instance.
	 * @param securityContextRepository the repository to use. Cannot be null.
	 */
	public SecurityContextHolderFilter(SecurityContextRepository securityContextRepository) {
		Assert.notNull(securityContextRepository, "securityContextRepository cannot be null");
		this.securityContextRepository = securityContextRepository;
	}

	@Override
	protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
			throws ServletException, IOException {
		SecurityContext securityContext = this.securityContextRepository.loadContext(request).get();
		try {
			SecurityContextHolder.setContext(securityContext);
			filterChain.doFilter(request, response);
		}
		finally {
			SecurityContextHolder.clearContext();
		}
	}

	@Override
	protected boolean shouldNotFilterErrorDispatch() {
		return this.shouldNotFilterErrorDispatch;
	}

	public void setShouldNotFilterErrorDispatch(boolean shouldNotFilterErrorDispatch) {
		this.shouldNotFilterErrorDispatch = shouldNotFilterErrorDispatch;
	}

}

OncePerRequestFilter .class
每次请求只执行一次filter

SecurityContextConfigurer.class

在这里插入图片描述

@Override
	@SuppressWarnings("unchecked")
	public void configure(H http) {
		SecurityContextRepository securityContextRepository = getSecurityContextRepository();
		if (this.requireExplicitSave) {
			SecurityContextHolderFilter securityContextHolderFilter = postProcess(
					new SecurityContextHolderFilter(securityContextRepository));
			http.addFilter(securityContextHolderFilter);
		}
		else {
		// 由框架帮你去构建filter
			SecurityContextPersistenceFilter securityContextFilter = new SecurityContextPersistenceFilter(
					securityContextRepository);
			SessionManagementConfigurer<?> sessionManagement = http.getConfigurer(SessionManagementConfigurer.class);
			SessionCreationPolicy sessionCreationPolicy = (sessionManagement != null)
					? sessionManagement.getSessionCreationPolicy() : null;
			if (SessionCreationPolicy.ALWAYS == sessionCreationPolicy) {
				securityContextFilter.setForceEagerSessionCreation(true);
				http.addFilter(postProcess(new ForceEagerSessionCreationFilter()));
			}
			securityContextFilter = postProcess(securityContextFilter);
			http.addFilter(securityContextFilter);
		}
	}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1612358.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法课程笔记——蓝桥云课第二次直播

注意是‘’ 都正确 可以理解为a的首地址也是数字&#xff0c;向右1 %p逻辑地址 Cin cout字符串“”单个字符本身‘’&#xff0c;其他时候不用加 这样就可以 逆运算 bool比较真假<从小到大排 11/25 都输出最省事 变成长度为n1的数组 考虑到整个都可能为一个颜色&#xff0c;…

UML/SysML建模工具更新情况-截至2024年4月(1)5款-Trufun建模平台 v2024

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 工具最新版本&#xff1a;itemis CREATE 5.2.2 更新时间 2024年3月22日 工具简介 原名YAKINDU Statechart Tools。状态机建模工具&#xff0c;支持各种语言的代码生成&#xff0c;提…

Semaphore信号量源码解读与使用

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java全栈-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 目录 1. 前言 2. 什么是Semaphore&#xff1f; 3. Semaphore源码解读 3.1 acquire…

yml文件解析

.yml 后缀的文件可以有多个application.yml # 项目相关配置 用于 RuoYiConfig.java ruoyi:# 名称name: RuoYi# 版本version: 3.8.5# 版权年份copyrightYear: 2023# 实例演示开关demoEnabled: true# 文件路径 示例&#xff08; Windows配置D:/ruoyi/uploadPath&#xff0c;Lin…

SQLite的知名用户(二十九)

返回&#xff1a;SQLite—系列文章目录 上一篇:SQLite作为应用程序文件格式&#xff08;二十八&#xff09; 下一篇:SQLite FTS5 扩展&#xff08;三十&#xff09; SQLite被数以百万计的应用程序使用 从字面上看&#xff0c;有数十亿次部署。 SQLite 是 当今世界。 下面…

C语言指针加法/减法

减法运算 指针的减法运算公式&#xff1a;就是两个指针的内存差值 / 指向的数据类型的内存空间大小 如果改变了指针类型指向的数据类型&#xff0c;对指针进行 - 运算&#xff0c;其新指向的位置只和转换后的数据类型有关 如果是char &#xff0c; 则指针指向变化1byte 如果…

【微服务】spring读取配置文件多种方式深入详解

目录 一、前言 二、java配置文件介绍 2.1 java配置文件产生原因 2.2 项目使用配置文件好处 2.3 springboot项目配置文件的必要性 2.4 微服务架构下配置文件使用场景 三、java读取配置文件常用方法 3.1 使用Properties类读取配置文件 3.1.1 使用getResourceAsStream读取…

【人工智能基础】知识表示和专家系统

目录 一、知识 知识 产生式表示法 产生式表示形式 确定的事实性知识的产生式表示 不确定的事实性知识的产生式表示 确定的规则知识的产生式表示 不确定的规则知识的产生式表示 产生式系统构成 优点 缺点 语义网络 优点 缺点 框架 框架的一般结构 框架的继承 优…

如何30天快速掌握键盘盲打

失业后在家备考公务员&#xff0c;发现了自己不正确的打字方式&#xff0c;决定每天抽出一点时间练习打字。在抖音上看到一些高手的飞速盲打键盘后&#xff0c;觉得使用正确的指法打字是很必要的。 练习打字&#xff0c;掌握正确的键盘指法十分关键。 练习打字的第一步是找到…

AJAX——ajax原理

1.XMLHttpRequest 定义&#xff1a;XMLHttpRequest&#xff08;XHR&#xff09;对象用于与服务器交互。通过XMLHttpRequest可以在不刷新页面的情况下请求特定URL&#xff0c;获取数据。这允许网页在不影响用户操作的情况下&#xff0c;更新页面的局部内容。XMLHttpRequest在AJA…

大话设计模式-里氏代换原则

里氏代换原则&#xff08;Liskov Substitution Principle&#xff0c;LSP&#xff09; 概念 里氏代换原则是面向对象设计的基本原则之一&#xff0c;由美国计算机科学家芭芭拉利斯科夫&#xff08;Barbara Liskov&#xff09;提出。这个原则定义了子类型之间的关系&#xff0…

MySQL之binlog归档日志

binlog&#xff08;二进制归档日志&#xff09; binlog 二进制日志记录保存所有执行过的修改操作语句&#xff0c;不保存查询操作。如果 MySQL 服务意外停止&#xff0c;可通过二进制日志文件排查&#xff0c;用户操作或表结构操作&#xff0c;从而来恢复数据库数据。启动 bin…

[BJDCTF 2020]encode

脱壳 rc4 自定义base64 异或

Make/Makefile详解

文章目录 make/MakefilemakeMakefile时间 make/Makefile Linux项目自动化构建工具。makefile定义了一系列的规则来指定&#xff0c;哪些文件需要先编译&#xff0c;哪些文件需要后编译&#xff0c;哪些文件需要重新编译&#xff0c;甚至进行更复杂的功能。makefile带来的好处就…

神经网络中的神经元和激活函数介绍

文章目录 1、什么是人工神经网络 2、什么是神经元 3、什么是激活函数 线性激活函数 Sigmoid激活函数 双曲正切激活函数 修正线性单元&#xff08;ReLU&#xff09;激活函数 Leaky ReLU激活函数 Softmax激活函数 1、什么是人工神经网络 神经网络能够利用多层神经元学习复杂的模…

回顾发展史,WEB组态终于可以搭建业务系统了!

一、WEB组态融合了传统工业组态和现代数据大屏 组态软件在工业控制领域有着二三十年的历史&#xff0c;比较知名的国内有组态王、国外有MCGS/WinCC等&#xff0c;用来搭建上位机监控画面&#xff0c;通常配合PLC使用&#xff0c;通过配置的方式&#xff0c;不需要编码&#xf…

线性表的链式存储(双向循环链表)

文章目录 前言一、双向循环链表是什么&#xff1f;二、双向循环链表的意义三、双向循环链表的操作实现总结 前言 T_T此专栏用于记录数据结构及算法的&#xff08;痛苦&#xff09;学习历程&#xff0c;便于日后复习&#xff08;这种事情不要啊&#xff09;。所用教材为《数据结…

micro-app的css样式隔离

手写微前端micro-app-CSS隔离 子应用的CSS可能会对基座应用或者其他子应用产生的影响 首先现在我们把react页面放入到vue2的页面大家也能看到一些问题了&#xff0c;在react中的index.css中对body的一些css样式&#xff0c;已经影响了基座应用的css。 为了看的更明显&#x…

【Linux】git

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解Linux的编译器-gcc/g&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 1.安装git2.在gitee上创建仓库3.首次配置4.下载仓库到本地5.三板斧6.git log7.gi…

STL::string简单介绍

目录 1、什么是STL STL6大组件:仿函数、算法、容器、空间配置器、迭代器、配接器 推荐文档&#xff08;必须学会看文档&#xff09; 2、string常用接口 a、初始化 1、什么是STL 标准模板库 STL&#xff08;Standard Template Library&#xff09;&#xff0c;主要是数据结构…