Spring Security认证架构介绍
在之前的Spring Security:总体架构中,我们讲到Spring Security整个架构是通过Bean容器和Servlet容器对过滤器的支持来实现的。我们将从过滤器出发介绍Spring Security的Servlet类型的认证架构。
1.AbstractAuthenticationProcessingFilter
AbstractAuthenticationProcessingFilter就是一个SecurityFilterChain中的过滤器,被用作验证用户凭证的基础 Filter。
示意图:

(当用户发送请求时,AbstractAuthenticationProcessingFilter会尝试提取Authentication对象;如果用户未经身份验证或提供的凭证无效,AbstractAuthenticationProcessingFilter 使用 AuthenticationEntryPoint 来生成适当的响应或重定向用户到登录页面。)
- 生成Authentication等待校验:当用户提交他们的凭证时,AbstractAuthenticationProcessingFilter 会从 HttpServletRequest 中创建一个要认证的Authentication(Authentication的第一种用法:封装待校验的用户信息,等待认证)。创建的Authentication认证的类型取决于 AbstractAuthenticationProcessingFilter 的子类。例如,UsernamePasswordAuthenticationFilter从 HttpServletRequest 中提交的 username 和 password 创建一个 UsernamePasswordAuthenticationToken。
- 校验Authentication:接下来,Authentication 被传入 AuthenticationManager,以进行认证。
- 认证结果处理:
- 认证失败:
- 清空SecurityContextHolder。(SecurityContextHolder可理解为是用于储存认证完成后的Authentication的环境)
- 如果配置了记住我(remember me),RememberMeServices.loginFail 方法会被调用。
- 调用 AuthenticationFailureHandler 来处理认证失败的情况,例如,生成适当的错误响应或执行自定义操作。
- 认证成功:
- SessionAuthenticationStrategy 被通知有新的登录,这是用于管理会话的策略。
- 验证成功后,Authentication 对象被保存在 SecurityContextHolder 中,以便后续请求可以访问已经认证的用户信息。
- 如果配置了记住我(remember me),RememberMeServices.loginSuccess 方法会被调用。
- 一个 InteractiveAuthenticationSuccessEvent 事件被发布,可以用于处理认证成功的事件。
- 最后,AuthenticationSuccessHandler 被调用,用于处理认证成功后的操作,例如,重定向用户或生成自定义响应。
- 认证失败:
接下来介绍过滤器中用到的各种组件。
2.SecurityContextHolder与SecurityContext

SecurityContextHolder用于存储全局的用户认证。
一个 SecurityContext 包含一个 Authentication 对象,如果 SecurityContext 包含一个 Authentication,该 SecurityContext 就被用作当前认证的用户。
直接在SecurityContextHolder设置用户,来表明用户已被认证:
SecurityContext context = SecurityContextHolder.createEmptyContext(); //创建一个空的 SecurityContext
Authentication authentication = new TestingAuthenticationToken("username", "password", "ROLE_USER"); //创建一个新的 Authentication 对象
context.setAuthentication(authentication);
SecurityContextHolder.setContext(context); //在 SecurityContextHolder 上设置 SecurityContext。
提取当前用户信息:
SecurityContext context = SecurityContextHolder.getContext();
Authentication authentication = context.getAuthentication();
String username = authentication.getName();
Object principal = authentication.getPrincipal();
Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
SecurityContextHolder使用每个线程的ThreadLocal来存储对应线程的SecurityContext。这意味着 SecurityContext 对同一线程中的方法总是可用的,即使 SecurityContext 没有被明确地作为参数传递给这些方法。
(注意:有些应用程序可能不希望一个线程对应一个安全上下文和一个用户,可以在启动时用策略模式配置 SecurityContextHolder——设置一个系统属性或调用SecurityContextHolder 的一个静态方法,以指定存储上下文的方式,如SecurityContextHolder.MODE_GLOBAL 策略将安全上下文信息将存储在一个静态的全局变量中,使其在整个应用程序中都全局可见。查看有哪些策略可以看SecurityContextHolder 的 JavaDoc。)
3.Authentication
Authentication有两个作用:
- 存储待校验的用户凭证(isAuthenticated() 返回 false),保存了用户刚提交的用来验证的信息,会由AuthenticationManager判定是否通过验证。
- 存储已校验的用户凭证,代表当前用户,可从SecurityContext中获得。
4.GrantedAuthority
应用了享元模式的权限实例类,代表了用户的角色(role)和作用域(scope)。
Authentication.getAuthorities()函数会返回GrantedAuthority 实例的集合。
5.AuthenticationManager、ProviderManager和AuthenticationProvider
AuthenticationManager 是定义 Spring Security 的 Filter 如何校验认证的接口,最常见的实现是ProviderManager。
ProviderManager会存储一个AuthenticationProvider的List,每个 AuthenticationProvider 执行特定类型的认证(如DaoAuthenticationProvider 支持基于用户名/密码的认证,而 JwtAuthenticationProvider 支持认证JWT令牌)。

每个 AuthenticationProvider 都有机会表明认证应该是成功的、失败的,或者表明它不能做出决定并允许下游的 AuthenticationProvider 来决定。
相关文章:
Spring Security认证架构介绍
在之前的Spring Security:总体架构中,我们讲到Spring Security整个架构是通过Bean容器和Servlet容器对过滤器的支持来实现的。我们将从过滤器出发介绍Spring Security的Servlet类型的认证架构。 1.AbstractAuthenticationProcessingFilter AbstractAut…...
提升代码重用性:模板设计模式在实际项目中的应用
在软件开发中,我们经常面临着相似的问题,需要使用相同的解决方法。当我们希望将这种通用的解决方法抽象出来,并在不同的情境中重复使用时,就可以使用设计模式中的模板模式(Template Pattern)。模板模式是一…...
11-k8s-service网络
文章目录 一、网络相关资源介绍二、开启ipvs三、nginx网络示例四、pod之间的访问示例五、service反向代理示例 一、网络相关资源介绍 Servcie介绍 Service是对一组提供相同功能的Pods的抽象,并为它们提供一个统一的入口。借助Service,应用可以方便的实现…...
MyBatisPlus(二十二)代码生成器
使用场景 使用代码生成器,根据数据库表,自动生成对应的 Entity,Mapper,Service,Controller 。 代码 依赖 两个依赖: 生成器依赖模板依赖 <dependency><groupId>com.baomidou</groupId&…...
git报错The project you were looking for could not be found 解决方式
问题描述: 使用git从远程仓库克隆项目到本地的时候。 git clone http://gitlab.com/project/xxxx.git出现这个问题:The project you were looking for could not be found. 原因分析: 你的账号没有项目的权限,你可以在浏览器输…...
“编辑微信小程序与后台数据交互与微信小程序wxs的使用“
引言 在现代移动应用开发中,微信小程序已经成为了一个非常流行和广泛使用的平台。为了使小程序能够展示丰富的内容和实现复杂的功能,与后台数据的交互是至关重要的。同时,微信小程序还提供了一种特殊的脚本语言——wxs,用于增强小…...
从Linux的tty_struct指针获取驱动上下文
背景 问题 前段时间开发一个tty驱动,用途是实现仪器对GPIB消息的接收、处理和上报。对于上报场景,下位机应用将上报内容写入一个驱动创建的tty设备,tty子系统将应用的输入转发给tty驱动,tty驱动将其转换成对SPI从设备࿰…...
PHP WAP餐厅点餐系统mysql数据库web结构apache计算机软件工程网页wamp
一、源码特点 PHP餐厅点餐系统是一套完善的web设计系统,对理解php编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。 PHP WAP餐厅点餐系统 代码 https://download.csdn.net/download/qq_41221322/88440001 二、…...
智慧公厕改变城市生活,厕所革命标杆应用解决方案
随着城市化进程的加快,公厕作为城市基础设施的重要组成部分,扮演着不可忽视的角色。然而,传统的公厕粗放型管理模式,已经无法满足市民日益增长的需求。为了提升公厕的管理和服务水平,智慧公厕应运而生。 什么是智慧公…...
YOLOv5改进实战 | 更换主干网络Backbone(四)之轻量化模型MobileNetV3
前言 轻量化网络设计是一种针对移动设备等资源受限环境的深度学习模型设计方法。下面是一些常见的轻量化网络设计方法: 网络剪枝:移除神经网络中冗余的连接和参数,以达到模型压缩和加速的目的。分组卷积:将卷积操作分解为若干个较小的卷积操作,并将它们分别作用于输入的不…...
上新啦!请查收云原生虚拟数仓 PieCloudDB 十月动态
PieCloudDB Database 最新动态 PieCloudDB 压缩效率得到提升 为了节省存储空间,降低用户存储费用,PieCloudDB 在压缩率上不断优化,包括: 对 HLL(HyperLogLog)支持游程编码(Run Length Encodi…...
第五章:Python中的集合(上)
Python中的集合 是一组不可重复元素的无序集合。集合通常用于在其中执行成员测试,删除重复项,计算交集、并集和差集等操作。 Python的集合是可迭代对象。具体来说,集合可以通过for循环逐个访问其中的元素。同时,集合还支持一些迭代器相关的方法,例如iter()函数和next()函…...
虚拟机灾备建设中NFS存储直接访问技术应用
NFS(Network File System)是一种网络文件系统,允许不同计算机之间共享文件和目录。在Linux系统中,可以使用NFS协议来访问网络存储。 当新服务器硬盘不足时,旧的服务器硬盘容量大,不拔硬盘的情况下…...
java业务开发常用的配置表及代码
配置表 通过配置表,灵活的配置。 开发中某些经常变更的参数值,加上配置。比如 订单30分钟后失效,需求变更,要改为15分钟,那么直接改配置表就行了,不用发版。 某些关键的容易出错的逻辑,加上一…...
安装Homebrew安装Git(Mac)
使用Homebrew安装Git(Mac) 1 安装Xcode 安装Homebrew之前,需要安装Xcode Comand Line Tools: xcode-select --install 2 安装Homebrew /usr/bin/ruby -e “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/mas…...
[云原生1.] Docker容器的简单介绍和基本管理
文章目录 1. Docker容器的基本概述1.1 简介1.2 容器的优点1.3 Docker与虚拟机的区别1.4 Docker核心组成1.4.1 镜像1.4.2 容器1.4.3 仓库 1.5 容器在内核中支持2种重要技术1.5.1 linux六大namespace(命名空间) 1.6 Docker的使用场景 2. Docker的部署2.1 前…...
JSR303数据校验
Component //注册bean ConfigurationProperties(prefix "person") Validated //数据校验 public class Person { Email(message"邮箱格式错误") //name必须是邮箱格式 private String name; } 使用数据校验,可以保证数据的正确性!…...
JavaCV + FFmpeg 播放音视频
JavaCV FFmpeg 播放音视频 1、导入JavaCV库1.1 使用ffmpeg必要库1.2 简单FFmpeg命令 待续~~~~ FFmpeg documentation bytedeco/javacv - GitHub 1、导入JavaCV库 gradle下面这种会导入javacv-platform所有包,非常耗时:https://repo.maven.apache.org/…...
万能DIY预约小程序源码系统 上门预约服务小程序搭建 适用于各种预约场景 自由DIY功能模块
在这个快节奏的时代,预约服务已经成为了我们日常生活的一部分。从看病挂号到餐厅预订,从美发美容到家政服务,预约已经深入到了各个领域。然而,传统的预约方式存在着许多不便,如电话预约、在线填写表格等,不…...
边缘检测算法
边缘检测算法是在数字图像处理中常用的一种技术,用于检测图像中物体边缘的位置。以下是几种常见的边缘检测算法: Sobel算子:Sobel算子是一种基于梯度的算法,通过计算图像的水平和垂直方向的梯度值,并将其组合起来得到边…...
在Ubuntu 22.04上搞定gnina:一个生物信息学小白的CUDA 11.8+Python 3.10完整配置手记
在Ubuntu 22.04上搞定gnina:一个生物信息学小白的CUDA 11.8Python 3.10完整配置手记 作为一个刚踏入计算化学领域的科研菜鸟,第一次听说gnina这个结合了传统分子对接和深度学习技术的工具时,内心既兴奋又忐忑。兴奋的是它能用卷积神经网络提升…...
快手万人组织的 AI 研发范式跃迁和落地实践
大家好,我是玄姐。PS:SDD AI 编程干货直播,欢迎点击预约,直播见。快手用 3 年时间、1 万名研发、8 条业务线验证了一个反直觉结论:给工程师配上 AI 编程工具,个人编码效率提升 20%-40%,但组织整…...
USB摄像头热拔插导致应用卡死?手把手教你用select给V4L2的DQBUF加超时保护
USB摄像头热拔插导致应用卡死?手把手教你用select给V4L2的DQBUF加超时保护 在嵌入式Linux和Android HAL开发中,USB摄像头热拔插导致的应用程序卡死是一个常见但令人头疼的问题。想象一下这样的场景:你的应用程序正在流畅地预览摄像头画面&…...
怎样高效压缩视频图片:3步掌握CompressO跨平台压缩神器
怎样高效压缩视频图片:3步掌握CompressO跨平台压缩神器 【免费下载链接】compressO Convert any video/image into a tiny size. 100% free & open-source. Available for Mac, Windows & Linux. 项目地址: https://gitcode.com/gh_mirrors/co/compressO …...
别再只盯着MACD了!用Python回测SuperTrend指标在A股的表现到底怎么样?
SuperTrend指标在A股实战中的表现:Python量化回测全解析 当MACD和均线已经成为每个交易者的标配工具时,市场上总有一些"网红指标"声称自己能够提供更清晰的趋势信号。SuperTrend指标就是近年来备受关注的一个——但它在A股市场真的能带来超额收…...
nli-MiniLM2-L6-H768惊艳案例:直播弹幕流每秒千条实时分类并生成话题热度词云
nli-MiniLM2-L6-H768惊艳案例:直播弹幕流每秒千条实时分类并生成话题热度词云 1. 项目背景与价值 在当今直播行业蓬勃发展的背景下,弹幕互动已成为用户参与的重要形式。然而,面对每秒上千条的弹幕数据流,传统的人工监控方式显得…...
LogExpert:Windows平台最强日志查看工具,告别tail命令的繁琐操作
LogExpert:Windows平台最强日志查看工具,告别tail命令的繁琐操作 【免费下载链接】LogExpert Windows tail program and log file analyzer. 项目地址: https://gitcode.com/gh_mirrors/lo/LogExpert 还在为查看日志文件而烦恼吗?面对…...
3分钟快速上手:通达信缠论量化分析插件实战指南
3分钟快速上手:通达信缠论量化分析插件实战指南 【免费下载链接】Indicator 通达信缠论可视化分析插件 项目地址: https://gitcode.com/gh_mirrors/ind/Indicator 在技术分析领域,缠论以其严谨的逻辑结构和精准的趋势判断而闻名,但复杂…...
多变量多步时间序列预测模型开发与实战指南
1. 多变量多步时间序列预测模型开发指南在空气质量预测领域,时间序列分析面临着多重挑战:多输入变量、多步预测需求以及跨多个站点的同步预测要求。EMC数据科学全球黑客马拉松数据集(简称"空气质量预测"数据集)记录了多…...
Vivado FIR IP核:从MATLAB设计到FPGA实现的完整信号处理链路
1. Vivado FIR IP核配置详解 FIR滤波器是数字信号处理中最常用的模块之一,而Vivado提供的FIR IP核让FPGA工程师能够快速实现高性能滤波功能。在实际项目中,我经常使用这个IP核来处理各种信号,比如滤除高频噪声、提取特定频段信号等。下面我就…...
