spring-security2

news2024/9/21 12:38:47

参考b站up主:传送门

前沿 :

回顾上章:最顶层就是一个过滤器
SpringSecurity流程:FilterChainProxy->根据请求决定一个 SecurityFilterChain (挨个调用其matches方法 匹配请求能否处理)-> 执行SecurityFilterChain中的一系列过滤器

FilterChainProxy相关的东西。
SecurityFilterChain接口用于配置一个FilterChainProxy

//Used to configure a FilterChainProxy.
public interface SecurityFilterChain {

	boolean matches(HttpServletRequest request);
	List<Filter> getFilters();

}

SecurityConfigurer、AbstractConfiguredSecurityBuilder
AbstractConfiguredSecurityBuilder上章提到过,间接实现了SecurityBuilder。

SecurityConfigurer

SecurityConfigurer用来去配置一个SecurityBuilder

/**
Allows for configuring a SecurityBuilder. All SecurityConfigurer first have their init(SecurityBuilder) method invoked. After all init(SecurityBuilder) methods have been invoked, each configure(SecurityBuilder) method is invoked.
*/
//所有的SecurityConfigurer都首先调用它的init(SecurityBuilder) 方法
public interface SecurityConfigurer<O, B extends SecurityBuilder<O>>{
// 初始化方法 初始化一个SecurityBuilder
void init(B builder) throws Exception;
// 配置方法
void configure(B builder) throws Exception;
}

1、SecurityConfigurer是去配置一个SecurityBuilder。
2、SecurityBuilder是构建对象的
最后:它的子类是相当的多

AbstractConfiguredSecurityBuilder

是SecurityBuilder的间接实现
1、共享对象设置
2、控制初始化(初始化前、中、后 配置 前、中、后)

AbstractSecurityBuilder

它做的事就是只允许build一次

public abstract class AbstractSecurityBuilder<O> implements SecurityBuilder<O>{
       private AtomicBoolean building = new AtomicBoolean();
       
       public final O build() throws Exception {
		if (this.building.compareAndSet(false, true)) {
			this.object = doBuild();
			return this.object;
		}
		throw new AlreadyBuiltException("This object has already been built");
	}
}

聊回AbstractConfiguredSecurityBuilder

(因为它在构建安全对象都会参与的类)
我们知道SecurityBuilder是为了构建对象的这个对象可能是SecurityFilterChain安全的过滤器链也有可能是AuthenticationManager(认证的管理器)后面说。

属性

//AbstractConfiguredSecurityBuilder需要被一堆的SecurityConfigurer去配置,所以需要维护一个configurers
private final LinkedHashMap<Class<? extends SecurityConfigurer<O, B>>, List<SecurityConfigurer<O, B>>> configurers = new LinkedHashMap<>();
//
private final List<SecurityConfigurer<O, B>> configurersAddedInInitializing = new ArrayList<>();

// 共享对象
private final Map<Class<?>, Object> sharedObjects = new HashMap<>();
//同一个configure是否允许出现两个
private final boolean allowConfigurersOfSameType;
//后置处理
private ObjectPostProcessor<Object> objectPostProcessor;

使用最频繁的方法

使用spring-security时我们经常使用.X.X.X 都会调用这个方法
添加一个SecurityConfigurer进来

private <C extends SecurityConfigurer<O, B>> void add(C configurer) {
		Assert.notNull(configurer, "configurer cannot be null");

		Class<? extends SecurityConfigurer<O, B>> clazz = (Class<? extends SecurityConfigurer<O, B>>) configurer
				.getClass();
				// 同步 只允许一个线程工作。configurers 一个LinkedHashMap
		synchronized (configurers) {
		//BuildState是一个枚举类 状态:未构建、初始化、配置、构建中、构建完成
			if (buildState.isConfigured()) {//是否已经配置
			//已经构建过了 不需要再应用
				throw new IllegalStateException("Cannot apply " + configurer
						+ " to already built object");
			}
			List<SecurityConfigurer<O, B>> configs = allowConfigurersOfSameType ? this.configurers
					.get(clazz) : null;
			if (configs == null) {
				configs = new ArrayList<>(1);
			}
			// 添加
			configs.add(configurer);
			this.configurers.put(clazz, configs);
			// 是否正在初始化
			if (buildState.isInitializing()) {
			//
				this.configurersAddedInInitializing.add(configurer);
			}
		}
	}

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

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

相关文章

Java简单认识泛型——图文详解

写在开头:想必大家和博主一样&#xff0c;在以往学习JavaSE的语法中&#xff0c;遇到了一个陌生的词——泛型&#xff0c;博主当时很好奇&#xff0c;什么是泛型呢&#xff1f;即使是学完了JavaSE&#xff0c;这个问题都没有解决&#xff0c;只能在百度查阅了解关于泛型的一些皮…

Maven依赖的基本概念

目录 1.依赖的基本配置 2.依赖范围 3.传递性依赖 1.依赖的基本配置 根元素project下的dependencies可以包含多个 dependence元素&#xff0c;以声明多个依赖。每个依赖都应该包含以下元素&#xff1a; 1. groupId, artifactId, version : 依赖的基本坐标&#xff0c; 对于任…

【C和C++】输出100内能够被13整除的数,取模判断方法

目录 前言基础概念重温整除例子小知识点收尾前言 在软件行业已经有快十年,技术虽然一般般,但是足够应付和解决编程入门的相关问题! 都说十年磨一剑,积累到一定经验,是时候发挥自己的价值,给予入门的同行些许的帮助! 为什么要写收费专栏,其实原因很简单,时间就是金钱(…

聚观早报 |拼多多跨境电商业务正式登陆澳洲;中国加快6G网络研发

今日要闻&#xff1a;拼多多跨境电商业务正式登陆澳洲&#xff1b;全球自动驾驶公司排名特斯拉垫底&#xff1b;中国将加快 6G 网络研发&#xff1b;B站再次“崩”上热搜&#xff01;已闪电修复&#xff1b;微软将必应AI聊天每次对话上限增加至8条拼多多跨境电商业务正式登陆澳…

大神教你在 Linux 中查看你的时区

在这篇短文中&#xff0c;我们将向你简单介绍几种 Linux 下查看系统时区的简单方法。在 Linux 机器中&#xff0c;尤其是生产服务器上的时间管理技能&#xff0c;是在系统管理中一个极其重要的方面。Linux 包含多种可用的时间管理工具&#xff0c;比如 date 或 timedatectlcomm…

自动化测试——执行javaScript脚本

文章目录一、点击元素(对应的click())二、input标签对应的值&#xff08;对应的send_keys()&#xff09;修改时间控件的属性值&#xff1a;三、元素的文本属性四、js脚本滚动操作一、点击元素(对应的click()) 使用场景&#xff1a;当使用显性等待不能解决问题时 代码中实现点击…

[神经网络]DETR目标检测网络

一、概述 相较于传统目标检测&#xff0c;DETR是一种纯端到端的网络。它不再需要NMS(非极大值抑制&#xff0c;用于去除多余的预测框)和生成anchor。 DETR提出了一个新的目标函数&#xff08;二分图匹配&#xff09;&#xff0c;这个函数可以强制网络输出一个独一无二的预测值&…

【Unity大气渲染】Unity Shader中实现大气散射(半成品)

写在前面 这是之前在做天空盒的时候同步写的分析博客&#xff0c;结果后面写到一半就忘了继续了&#xff0c;这里先贴出当时写的半成品&#xff0c;有小伙伴问我怎么做的&#xff0c;这里只能尽力把之前的半成品先放出来了&#xff08;写得很乱&#xff0c;勿怪orz&#xff09…

用C语言实现一个任意类型的队列

下面是一个简单的无类型队列的实现&#xff1a; #include <stdio.h> #include <stdlib.h>typedef struct Node {void *data;struct Node *next; } Node;typedef struct Queue {Node *front;Node *rear;int size; } Queue;void enqueue(Queue *queue, void *data);…

[蓝桥杯] 枚举、模拟和排列问题

文章目录 一、连号区间数 1、1 题目描述 1、2 题解关键思路与解答 二、递增三元组 2、1 题目描述 2、2 题解关键思路与解答 三、错误票据 3、1 题目描述 3、2 题解关键思路与解答 四、回文日期 4、1 题目描述 4、2 题解关键思路与解答 五、归并排序 标题&#xff1a;蓝桥杯——…

windows和linux出现timewait过多的解决方法

一、timewait出现在客户端还是服务端以及什么情况下出现 我是做性能测试的。在压测过程中遇到了timewait过多的情况&#xff0c;下面来看一下timewait产生的原因及解决办法&#xff0c;我自己在服务器起了一个很简单的springboot应用来验证自己的猜想及解决办法。 说到产生原…

基于docker部署prometheus

1、prometheus架构 Prometheus Server: 收集指标和存储时间序列数据&#xff0c;并提供查询接口 ClientLibrary:客户端库 Push Gateway: 短期存储指标数据。主要用于临时性的任务 Exporters:采集已有的第三方服务监控指标并暴露 metrics Alertmanager:告警 Web UI :简单的…

VS插件CodeRush全新发布v22.2.4——改进对VS 17.5的支持

CodeRush是一个强大的Visual Studio .NET 插件&#xff0c;它利用整合技术&#xff0c;通过促进开发者和团队效率来提升开发者体验。CodeRush能帮助你以极高的效率创建和维护源代码。Consume-first 申明&#xff0c;强大的模板&#xff0c;智能的选择工具&#xff0c;智能代码分…

【C++升级之路】第九篇:vector

&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f; &#x1f36d;&#x1f36d;系列专栏&#xff1a;【C学习与应用】 ✒️✒️本篇内容&#xff1a;vector的基本概念、vector的使用&#xff08;构造&#xff0c;迭代器&#xff0c;空间增长&#xff0c;增删…

小樽C++ 单章③ 一维数组

目录 一、一维数组认识与使用 1.4 数组的输入与输出 1.5 最大值与最小值的求解 二、一维数组的操作用法 2.1 数组的插入与删除 2.2 数组某个值的查找 2.3多个数组的合并 2.4多个数组的有序合并 三、一维数组的应用 3.1 斐波那契数列 3.2 淘淘摘苹果 3.3 翻纸牌游戏…

RTOS中互斥量的原理以及应用

互斥量的原理 RTOS中的互斥量是一种同步机制&#xff0c;用于保护共享资源&#xff0c;防止多个任务同时访问该资源&#xff0c;从而避免数据竞争和不一致性。 互斥量的原理是通过对共享资源进行加锁和解锁操作来实现的。 在RTOS中&#xff0c;互斥量通常是一个数据结构&…

为什么说要慎用BeanUtils,因为性能真的拉跨

1 背景之前在专栏中讲过“不推荐使用属性拷贝工具”&#xff0c;推荐直接定义转换类和方法使用 IDEA 插件自动填充 get / set 函数。不推荐的主要理由是&#xff1a;有些属性拷贝工具性能有点差有些属性拷贝工具有“BUG”使用属性拷贝工具容易存在一些隐患&#xff08;后面例子…

九龙证券|磷酸亚铁锂是什么?磷酸亚铁锂的特点和性能介绍

磷酸亚铁锂是一种新式锂离子电池电极资料&#xff0c;化学式&#xff1a;LiFePO4&#xff0c;磷酸亚铁锂为近来新开发的锂离子电池电极资料&#xff0c;首要用于动力锂离子电池&#xff0c;作为正极活性物质运用&#xff0c;人们习气也称其为磷酸铁锂。 磷酸亚铁锂的特色和功能…

【计算机网络】随机访问介质访问控制中的ALOHA协议、CSMA协议、CSMA/CD协议和CSMA/CA协议

二、随机访问介质访问控制 信道上的所有用户可随机发送信息 1. 简单ALOHA协议 解决信息发送时的冲突问题。其特点是不监听信道&#xff0c;不按时间槽发送&#xff0c;随机重发。 思想&#xff1a;在超时后&#xff0c;等随机一段时间后再重传 2. 时隙ALOHA协议 时隙ALOH…

送给她最最浪漫的表白(Python代码实现)

目录I 最美的浪漫 II 昨日浪漫的表白III 关于“美”的哲思 IV Python代码实现 I 最美的浪漫 II 昨日浪漫的表白 她问:有一个问题&#xff0c;我只问一遍&#xff0c;为什么是我?我微微一笑答道:笞案很长&#xff0c;我要用一生来回答。我&#xff1a;图书馆旁边的星空真美&…