深入理解HttpSecurity的设计

news/2025/2/23 5:07:14

一、HttpSecurity的应用

  在前章节的介绍中我们讲解了基于配置文件的使用方式,也就是如下的使用。

image.png

  也就是在配置文件中通过 security:http 等标签来定义了认证需要的相关信息,但是在SpringBoot项目中,我们慢慢脱离了xml配置文件的方式,在SpringSecurity中提供了HttpSecurity等工具类,这里HttpSecurity就等同于我们在配置文件中定义的http标签。要使用的话方式如下。

image.png

  通过代码结果来看和配置文件的效果是一样的。基于配置文件的方式我们之前分析过,是通过标签对应的handler来解析处理的,那么HttpSecurity这块是如何处理的呢?我们来详细分析下。

二、HttpSecurity的类图结构

image.png

  可以看出HttpSecurity的类图结构相对比较简单,继承了一个父类,实现了两个接口。我们分别来看看他们的作用是什么?

1.SecurityBuilder接口

  我们先来看看SecurityBuilder接口,通过字面含义我们就可以发现这是一个帮我们创建对象的工具类。

public interface SecurityBuilder<O> {
   

	/**
	 * Builds the object and returns it or null.
	 * @return the Object to be built or null if the implementation allows it.
	 * @throws Exception if an error occurred when building the Object
	 */
	O build() throws Exception;

}

  通过源码我们可以看到在SecurityBuilder中给我们提供了一个build()方法。在接口名称处声明了一个泛型,而build()方法返回的正好是这个泛型的对象,其实就很好理解了,也就是SecurityBuilder会创建指定类型的对象。结合HttpSecurity中实现SecurityBuilder接口时指定的泛型我们可以看出创建的具体对象是什么类型。

image.png

  可以看出SecurityBuilder会通过build方法给我们创建一个DefaultSecurityFilterChain对象。也就是拦截请求的那个默认的过滤器链对象。

image.png

然后进入到doBuild()方法,会进入到AbstractConfiguredSecurityBuilder中的方法

	@Override
	protected final O doBuild() throws Exception {
   
		synchronized (this.configurers) {
   
			this.buildState = BuildState.INITIALIZING;
			beforeInit();
			init();
			this.buildState = BuildState.CONFIGURING;
			beforeConfigure();
			configure();
			this.buildState = BuildState.BUILDING;
	 		// 获取构建的对象,上面的方法可以先忽略
			O result = performBuild();
			this.buildState = BuildState.BUILT;
			return result;
		}
	}

进入到HttpSecurity中可以查看performBuild()方法的具体实现。

	@Override
	protected DefaultSecurityFilterChain performBuild() {
   
        // 对所有的过滤器做排序
		this.filters.sort(OrderComparator.INSTANCE);
		List<Filter> sortedFilters = new ArrayList<>(this.filters.size

http://www.niftyadmin.cn/n/5862971.html

相关文章

账号存活率骤降19%?2025跨境账号安全白皮书预警

账号安全危机来袭&#xff0c;跨境电商如何应对挑战&#xff1f; 在全球电商产业快速扩张的今天&#xff0c;账号安全问题日益严峻&#xff0c;尤其是在跨境电商领域。根据2025年《跨境账号安全白皮书》的报告&#xff0c;跨境电商平台账号存活率骤降19%&#xff0c;这一令人震…

2025.2.23机器学习笔记:PINN文献阅读

2025.2.23周报 一、文献阅读题目信息摘要Abstract创新点网络架构架构A架构B架构C 实验结论后续展望 一、文献阅读 题目信息 题目&#xff1a; Physics-Informed Neural Networks for Modeling Water Flows in a River Channel期刊&#xff1a; IEEE TRANSACTIONS ON ARTIFICI…

鸿蒙NEXT开发-学生管理系统小案例

注意&#xff1a;博主有个鸿蒙专栏&#xff0c;里面从上到下有关于鸿蒙next的教学文档&#xff0c;大家感兴趣可以学习下 如果大家觉得博主文章写的好的话&#xff0c;可以点下关注&#xff0c;博主会一直更新鸿蒙next相关知识 目录 1. 基本介绍 2. 案例设计图 2.1 app应用…

Linux下基于root指定用户执行命令的方法

个人博客地址&#xff1a;Linux下基于root指定用户执行命令的方法 | 一张假钞的真实世界 Docker在构建镜像阶段无法配置免密码sudo。但是在实际需求场景中会遇到需要使用sudo的场景。所以&#xff0c;我的解决思路是镜像构建及CMD使用root&#xff0c;在CMD的脚本中执行需要su…

智能网络感知,打造极致流畅的鸿蒙原生版中国移动云盘图文体验

背景 中国移动云盘&#xff08;原“和彩云网盘”&#xff09;是中国移动重磅推出的安全、智能、不限速、移动用户免流的智能云盘&#xff0c;致力于成为5G时代用户个人与家庭的数字资产管理中心&#xff0c;是中国移动继语音、短信、流量后的“第四项基础服务”。 照片、音视…

Linux系统编程基础详解

Linux 系统详解 大纲 引言 Linux 的定义Linux 的历史与发展本文结构概述 Linux 的基本概念 Linux 的架构 内核与用户空间系统调用 Linux 的文件系统 文件与目录结构权限管理 Linux 的进程管理 进程与线程进程调度 Linux 的基本命令与操作 常用命令概述 文件与目录操作命令文…

实现“微观自治、中观协作、宏观统筹”的智能生态系统架构

第一步:明确核心需求与挑战 系统的核心需求和在设计过程中可能遇到的挑战: 核心需求: 微观自治: 每个节点(自治智能体)具备自主决策、学习和处理数据的能力。中观协作: 节点之间能够通过联邦学习等机制安全地共享知识,协同提升。宏观统筹: 中央综合智能体能够监控、协…

Ubuntu 20.04源码安装opencv 4.5.0

安装依赖项 sudo apt install -y g sudo apt install -y cmake sudo apt install -y make sudo apt install -y wget unzip安装opencv依赖库 sudo apt-get install build-essential libgtk2.0-dev libgtk-3-dev libavcodec-dev libavformat-dev libjpeg-dev libswscale-dev l…