Spring Security认证源码解析(示意图)

news2025/1/14 18:31:07

 建议先看完Spring Security总体架构介绍和Spring Security认证架构介绍,然后从FilterChainProxy的doFilterInternal函数开始,配合文章进行debug以理解Spring Security认证源码的执行流程。


在之前的Spring Security认证架构介绍中,我们已经知道,直接访问一个资源默认的大致流程是:

  1. 用户发送资源请求(资源需要认证)。后端保存请求并重定向到login登录界面。(实际流程为匿名用户在AnonymousAuthenticationFilter获得一个匿名身份,然后在AuthorizationFilter过滤器中验证权限,抛出一个AccessDeniedException异常,该异常被ExceptionTranslationFilter捕获并调用handleAccessDeniedException函数处理,该函数中判断,如果是匿名用户,就会保存请求,并重定向到登录页面。)
  2. 用户进入认证界面,并发送表单进行登录。
  3. 表单请求进入FilterChain,并在UsernamePasswordAuthenticationFilter进行验证。(实际流程为FilterChainProxy调用UsernamePasswordAuthenticationFilter继承的父类AbstractAuthenticationProcessingFilter的过滤方法doFilter,doFilter再调用重写的过滤器类的attemptAuthentication函数)
  4. UsernamePasswordAuthenticationFilter处理流程(即attemptAuthentication函数逻辑):
    1. 从表单中获得username和password,封装成UsernamePasswordAuthenticationToken。
    2. 使用AuthenticationManager(实现类为ProviderManager)验证UsernamePasswordAuthenticationToken。
    3. 验证失败:ProviderManager抛出异常,信息为“用户名或密码错误”,被UsernamePasswordAuthenticationFilter捕获(实际是父类AbstractAuthenticationProcessingFilter的过滤方法doFilter下的异常处理机制),UsernamePasswordAuthenticationFilter调用AuthenticationFailureHandler类(实现类为SimpleUrlAuthenticationFailureHandler)的onAuthenticationFailure方法,onAuthenticationFailure方法保存原请求,将错误信息保存到response中然后应用themeleaf设置到动态网页,并重定向到/login?error。
    4. 验证成功:ProviderManager调用DefaultAuthenticationEventPublisher发布一个AuthenticationSuccessEvent事件,然后清除Token中Credentials信息;之后返回到UsernamePasswordAuthenticationFilter,更新认证到用户的会话信息,然后调用successfulAuthentication,将认证存入SecurityContext,调用rememberMeServices的loginSuccess,调用ApplicationContext(AnnotationConfigServletWebServerApplicationContext)发送一个InteractiveAuthenticationSuccessEvent事件,然后调用SavedRequestAwareAuthenticationSuccessHandler的onAuthenticationSuccess函数,在这里将进行重定向到原请求路径。

进入登录示意图:

登录验证失败示意图:

登录验证成功示意图:

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

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

相关文章

C算法:不使用第三变量,实现两数交换

写一个函数实现两数交换&#xff0c;要求不使用第三个变量。 输入样例&#xff1a; 14 16 输出样例&#xff1a; 16 14 代码实现&#xff1a; #include<stdio.h>int main() {int a,b;printf("please input two num:\n"); scanf("%d%d",&…

C# 使用waveIn实现声音采集

文章目录 前言一、需要的对象及方法二、整体流程三、关键实现1、使用Thread开启线程2、TaskCompletionSource实现异步3、将指针封装为Stream 四、完整代码1.接口2.具体实现 五、使用示例方式一方式二 总结 前言 之前实现了《C 使用waveIn实现声音采集》&#xff0c;后来C#项目…

Ubuntu 命令行设置静态IP地址方法

一、先ifconfig查看电脑的网卡信息 找到有线网络或WiFi网络的网卡名称&#xff0c;我这里是eno1 二、输入route -n命令&#xff0c;打印路由表&#xff0c;这里主要是为了查看网关地址 我这里网关地址是192.168.10.1 三、更改配置文件 输入 vim /etc/network/interfaces&am…

企业一般纳税人查询API:简化税务信息获取的利器

前言 随着数字化时代的到来&#xff0c;企业纳税和财务管理领域也经历了革命性的变化。税务管理不再是繁琐的手动工作&#xff0c;而是通过技术工具实现高效和精确。其中&#xff0c;企业一般纳税人查询API成为了企业税务信息获取的强大利器。这一工具不仅简化了税务信息的访问…

微信公众号怎么添加送餐外卖系统

在当今快节奏的生活中&#xff0c;外卖已经成为了人们解决日常饮食需求的重要方式。微信公众号作为一个拥有广泛用户群体的平台&#xff0c;加入送餐外卖系统可以为公众号持有者带来更多的商业机会和用户便利。本文将介绍如何在微信公众号中添加送餐外卖系统&#xff0c;提升公…

系统设计 - 我们如何通俗的理解那些技术的运行原理 - 第七部分:Git、云服务、生产力工具

本心、输入输出、结果 文章目录 系统设计 - 我们如何通俗的理解那些技术的运行原理 - 第七部分&#xff1a;Git、云服务、生产力工具前言Git &#xff1a;Git 命令的工作原理Git 如何工作Git merge vs. Git rebaseGit mergeGit rebaseGit rebaes 的黄金法则 云服务 : 不同云服务…

【C++】网络在线五子棋

项目介绍 本项目主要实现⼀个网页版的五⼦棋对战游戏&#xff0c;其主要⽀持以下核心功能&#xff1a; • 用户管理&#xff1a;实现用户注册&#xff0c;用户登录、获取用户信息、用户天梯分数记录、用户比赛场次记录等 • 匹配对战&#xff1a;实现两个玩家在网页端根据天梯分…

C++前缀和算法的应用:石头游戏 VIII 原理源码测试用例

本文涉及的基础知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 题目 Alice 和 Bob 玩一个游戏&#xff0c;两人轮流操作&#xff0c; Alice 先手 。 总共有 n 个石子排成一行。轮到某个玩家的回合时&#xff0c;如果石子的数目 大…

ACM练习C++知识点笔记

1、字符和数字的转换 #include<iostream> using namespace std; int main(){int n 8 - 48;cout<<n<<endl;return 0; } 数字转字符串 #include <string> #include <sstream> #include <iostream> using namespace std; int main() {doubl…

基于Django开发的推荐系统与数据分析系统

基于Django开发的推荐系统与数据分析系统 一、简介 已开发的的推荐系统&#xff1a;图书管理系统、电影推荐系统、在线选修课程推荐系统、健身推荐系统、资讯推荐系统&#xff1b; 已开发的数据分析系统&#xff1a;大众点评店铺数据分析系统。 推荐系统的目的是信息过载所…

rockchip 3588 HDMI avmute

概述 HDMI (High-Definition Multimedia Interface) 是一种数字接口标准&#xff0c;用于传输高清视频和多通道音频信号。AVMUTE 是 HDMI 规范中的一个术语&#xff0c;表示"Audio-Video Mute"&#xff08;音视频静音&#xff09;。AVMUTE 通常与 HDMI 设备的音频和…

提高Java程序性能!了解可达性分析算法、强软弱虚引用和三色标记GC的过程,避免不可达对象阻碍程序性能!

文章目录 &#x1f34a; 可达性分析算法&#x1f34a; 强软弱虚引用&#x1f389; 强引用&#x1f389; 软引用&#x1f389; 弱引用&#x1f389; 虚引用 &#x1f34a; 不可达对象GC的过程&#x1f389; GC中不可达对象的回收过程&#x1f4dd; 1. 标记阶段&#x1f4dd; 2. …

远程IO模块物联网应用提高工业自动化生产效率

远程IO模块是一款常用于工业自动化领域的通讯设备&#xff0c;它可以实现远程监测&#xff0c;帮助企业更加有效地掌控生产状态&#xff0c;提高生产效率。远程IO模块的作用是将分散的输入输出信号集中管理&#xff0c;实现实时数据采集、传输与控制。 远程IO模块通过安装在设…

Windows / Ubuntu 连wifi,网线连接旭日X3派以共享网络

首先&#xff0c;PC电脑连好wifi Windows 找到【控制面板->网络和Internet->网络和共享中心->查看网络状态和任务->更改适配器设置】 找到WLAN&#xff0c;右键【属性->共享】勾上允许&#xff0c;然后【确定】。 Ubuntu 打开设置&#xff0c;找到有线设置…

2024SCI经验心得分享---如何在零基础、导师基本放养的情况下---发表自己的第一篇SCI(三区)经验分享篇

本期的经验分享&#xff0c;采访到了我的一位非常非常非常优秀的师妹&#xff0c;师妹于今年6月份投稿&#xff0c;10月份录用&#xff0c;历时四个月录用了自己的第一篇SCI&#xff08;三区&#xff09;的文章图像处理类的&#xff0c;同时师妹也取得了很多其他优秀的荣誉。 众…

Python数据结构(栈)

Python数据结构&#xff08;栈&#xff09; 栈(stack)&#xff0c;有些地方称为堆栈&#xff0c;是一种容器&#xff0c;可存入数据元素、访问元素、删除元素&#xff0c;它的特点在于只能允许在容器的一端(称为栈顶端指标&#xff0c;英语: top)进行加入数据(英语: push)和输…

手撕Vue-实现计算属性

前言 经过上一篇的学习, 完成了将数据代理到了 Nue 的实例上方&#xff0c;这个我们已经撕完了。接下来要实现的是计算属性&#xff0c;计算属性的实现原理是通过 Object.defineProperty() 来实现的&#xff0c;我们先来看看计算属性的使用。 看之前先来改造一下我们的代码基础…

DevExpress WinForms地图组件 - 轻松集成地图功能到应用程序

DevExpress WinForms地图控件允许您在WinForms应用程序中合并地图服务&#xff0c;您可以选择现有的地图资源&#xff0c;如如Bing或OpenStreetMap&#xff0c;或者在公司网络中创建自己的地图数据服务器。DevExpress WinForms地图控件完全支持矢量和笛卡尔坐标地图。 DevExpr…

Plex踩坑——移动缓存目录

plex在生成缩略图、刮削视频的时候会生成大量的缓存文件&#xff0c;占用磁盘空间。 plex默认缓存存储位置为C:\Users\xxx\AppData\Local\Plex Media Server&#xff0c;并且这个路径在plex设置中无法更改。 可以通过修改注册表的方式修改该路径。 首先推出plex账号&#xff…

学习视觉CV Transformer (1)--Transformer介绍

先放Transformer的经典文章 Attention Is All You Need 论文代码&#xff1a;https://paperswithcode.com/paper/attention-is-all-you-need Transformer结构是google在17年的Attention Is All You Need论文中提出&#xff0c;首先主要是在自然语言处理NLP方面应用&#xff0c…