SpringSecurity的认证流程源码深入刨析

news2024/11/16 20:27:05

环境

SpringBoot版本:2.7.14

流程图

在这里插入图片描述

默认的Filter

SpringSecurity的默认Filter地址:http://t.csdn.cn/YH838

常见的认证授权技术

1、基于表单的认证(Cookie & Session)
基于表单的认证并不是在 HTTP 协议中定义的,而是服务器自己实现的认证方式,安全程度取决于实现程度。一般用 Cookie 来管理 Session 会话,是最常用的认证方式之一。它的安全程度取决于服务器的实现程度,客户端在Cookie中携带认证信息,服务器解析并返回结果。
2、基于JWT(Json Web Token)的认证
App和服务端常用的认证方式,用户ID和密码传输到服务器上验证,服务器验证通过以后生成加密的JWT Token返回给客户端,客户端再发起请求时携带返回的Token进行认证。(多了个防篡改)
3、Http Basic 认证
最早的 Http 认证方式,用户 ID 和密码以分号连接,经过 Base64 编码后存储到 Authorization 字段,发送到服务端进行认证 ;用户 ID/密码 以明文形式暴露在网络上,安全性较差。(如果没有使用 SSL/TLS 这样的传输层安全的协议,那么以明文传输的密钥和口令很容易被拦截)
4、Http Digest 认证
在 HttpBasic 的基础上,进行了一些安全性的改造,用户ID, 密码 , 服务器/客户端随机数,域,请求信息,经过 MD5 加密后存储到 Authorization 字段,发送到服务端进行认证;密码经过 MD5 加密,安全性比 Basic 略高。
5、其他认证方式(Oauth 认证,单点登陆,HMAC 认证)
通过特定的加密字段和加密流程,对客户端和服务端的信息进行加密生成认证字段,放在 Authorization 或者是消息体里来实现客户信息的认证。

引言

关于SpringSecurity启动是怎么加载、注册进Spring容器的;组件是怎么加载的可以看这两篇
SpringSecurity启动流程源码刨析地址:http://t.csdn.cn/vXbbD
SpringSecurity的请求分发执行流程源码刨析地址:http://t.csdn.cn/Yy1GB

认证流程概述

1、用户登录前,默认生成的Authentication对象处于未认证状态,登录时会交由Authentication Manager负责进行认证。
2、AuthenticationManager会将Authentication中的用户名/密码与UserDetails中的用户名/密码对比,完成认证工作,认证成功后会生成一个已认证状态的Authentication对象;
3、最后把认证通过的Authentication对象写入到SecurityContext中,在用户有后续请求时,可从Authentication中检查权限。

认证流程源码刨析

1、AbstractAuthenticationProcessingFilter
请求过来之后会经过一系列过滤器到这儿,这个过滤器是和认证授权直接相关的,它是个抽象的父类,内部定义了认证处理的过程。可以看到他在doFilter中调了attemptAuthentication方法;这个方法的实现是在UsernamePasswordAuthenticationFilter中。
在这里插入图片描述

2、UsernamePasswordAuthenticationFilter
跟进这个方法可以看到他的具体实现,进行了用户名、密码的校验;封装了UsernamePasswordAuthenticationToken对象;设置了details;
在这里插入图片描述

获取了AuthenticationManager对象,并且调用了authenticate方法进行认证;跟进此方法;
3、可以看到是进入了AuthenticationManager的实现类ProviderManager;调用了此实现类的authenticate方法;
在这里插入图片描述

4、通过循环遍历从providers中找到能支持此AuthenticationToken的AuthenticationProvider;如果找到就调用authenticate方法。如果找不到则调用父类的authenticate方法;
在这里插入图片描述

在这里插入图片描述

5、跟进authenticate方法;可以看到进入了AuthenticationProvider的实现类AbstractUserDetailsAuthenticationProvider;它在authenticate方法中判断了用户名是否在缓存中;如果不在会调用retrieveUser方法进行查询;
在这里插入图片描述

6、跟进retrieveUser方法;可以看到进入了继承自AbstractUserDetailsAuthenticationProvider的DaoAuthenticationProvider,在这个类中实现了retrieveUser方法;
在这里插入图片描述

7、可以看到在这个方法中通过UserDetailsService的loadUserByUsername方法获取了用户信息。后续可以自己实现此方法。
在这里插入图片描述

8、跟进此方法,可以看到获取成功之后会封装成User对象;如果没有获取到会抛出异常
在这里插入图片描述

9、继续回到AbstractUserDetailsAuthenticationProvider中执行preAuthenticationChecks.check方法;会在此方法中进行账号是否锁定、是否可用、是否过期等验证;
在这里插入图片描述

10、接下来会在additionalAuthenticationChecks方法中进行密码匹配;如果匹配失败会抛出异常
在这里插入图片描述

11、然后在createSuccessAuthentication方法中进行Authentication的重新封装;
在这里插入图片描述

12、回到ProviderManager通过eventPublisher.publishAuthenticationSuccess进行认证成功事件的发布。
在这里插入图片描述

13、然后回到AbstractAuthenticationProcessingFilter,通过successfulAuthentication方法设置SecurityContext
在这里插入图片描述

在这里插入图片描述

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

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

相关文章

互联网社交礼仪:我到底该怎么笑才对

点击文末“阅读原文”即可参与节目互动 剪辑、音频 / 小黑 运营 / SandLiu 卷圈 监制 / 姝琦 封面 / 姝琦Midjourney 产品统筹 / bobo 场地支持 / 声湃轩天津录音间 一切要从不知情的阿福发微笑脸说起。 微笑、呲牙笑、流汗笑,到底哪个才是真正的笑&#xff1…

C++入门篇10---stack+queue+priority_queue

前言 本文主要是介绍C库中的栈、队列和优先级队列(其实就是堆)的一些接口以及如何用C来实现它们,对这三种数据结构就不多介绍了,如有不了解的同学,请查阅我之前写的两篇博客 栈和队列的实现二叉树和堆详解 下面正片开始 一、stack 1.了解s…

企业知识库构建:关于企业知识库及知识平台搭建的重要性!

随着企业规模的不断发展与壮大,在企业运营相关知识信息将不断产生,而知识处理中,建立知识库会面临着信息零散碎片化、信息关系复杂难梳理、信息不完整、碎片数据难以沉淀存储等问题…… 所以作为企业管理者,首先需要意识到关于企业…

SPA项目之主页面--数据表格的增删改查

🥳🥳Welcome Huihuis Code World ! !🥳🥳 接下来看看由辉辉所写的关于VueElementUI的相关操作吧 目录 🥳🥳Welcome Huihuis Code World ! !🥳🥳 一.增删改查 1.样式准备 2.编码 …

聚合统一,SpringBoot实现全局响应和全局异常处理

目录 前言 全局响应 数据规范 状态码(错误码) 全局响应类 使用 优化 全局异常处理 为什么需要全局异常处理 业务异常类 全局捕获 使用 优化 总结 前言 在悦享校园1.0版本中的数据返回采用了以Map对象返回的方式,虽然较为便捷但也带来一些问题。一是在…

机器人制作开源方案 | 货物输送小车

作者:周展鹏 黄万森 彭军铭 吕会权 聂文俊 单位:柳州工学院 指导老师:蔡洪炜 王一波 1. 场景调研 目前货物输送已成为人们生活中必不可少的部分,加之国内近年来有因快递配送导致疫情迅速传播的事件常有发生,因此在疫…

Mybatis3详解 之 全局配置文件详解

1、全局配置文件 前面我们看到的Mybatis全局文件并没有全部列举出来&#xff0c;所以这一章我们来详细的介绍一遍&#xff0c;Mybatis的全局配置文件并不是很复杂&#xff0c;它的所有元素和代码如下所示&#xff1a; <?xml version"1.0" encoding"UTF-8&…

精通Linux系列第二章:虚拟机安装Linux系统环境教程

文章目录 一、前言二、VMware Fusion安装教程2.1 说说安装虚拟机的好处2.2 安装VMware Fusion 三、环境搭建3.1 各种Linux发行版介绍与iso下载链接3.2 VMware Fusion安装Linux3.2.1 Ubuntu桌面版安装3.2.2 Debian桌面版安装3.2.3 Fedora桌面版安装3.2.4 CentOS桌面版安装3.2.5 …

RHCA礼品领取步骤

RHCA礼品领取步骤 1. 进入领取页面 考过RHCA的5门课程后会收到5份单科1份RHCA电子证书.其实还有一份玻璃证书笔记本A面贴纸红帽ID号短袖T恤可以领取. 领取地址如下: http://redhat.brandfuel.com 在第一框内填写红帽ID就是考试时填写的9位id号,每3位用-分割 第二个框填写姓,就…

图扑软件受邀亮相 IOTE 2023 国际物联网展

IOTE 2023 国际物联网展&#xff0c;作为全球物联网领域的盛会&#xff0c;于 9 月 20 日 - 22 日在中国深圳拉开帷幕。本届展会以“IoT构建数字经济底座”为主题&#xff0c;由深圳市物联网产业协会主办&#xff0c;打造当前物联网最新科技大秀。促进物联网与各行业深度融合&a…

Android studio “Layout Inspector“工具在Android14 userdebug设备无法正常使用

背景描述 做rom开发的都知道&#xff0c;“Layout Inspector”和“Attach Debugger to Android Process”是studio里很好用的工具&#xff0c;可以用来查看布局、调试系统进程&#xff08;比如setting、launcher、systemui&#xff09;。 问题描述 最进刚开始一个Android 14…

海贝造音强势登陆深圳 助力本土原创音乐升阶

海贝负责人&#xff1a;萧弘天先生 据媒体报导&#xff0c;全球音乐产业收入已恢复至疫情前水平&#xff0c;甚至比往年高出16%&#xff0c;值此佳机&#xff0c;在大湾区深耕娱乐行业30年之久的一众行业先锋&#xff0c;港澳资深传媒人在深圳成立了海贝造音。 深圳&#xff…

RFID资产管理系统应用助力企业实现高效资产运营管理

在企业运营中&#xff0c;资产以各种形式存在&#xff0c;包括生产物资、设备、车辆、办公桌、电脑、电缆等等&#xff0c;这些资产都具有价值高、流动性强、安全管理难等特点&#xff0c;而固定资产数量多、种类繁多、价值高、使用周期长、使用地点分散等特点使得其管理变得非…

增值税发票的Python代码快速识别

# 导入potencent这个库&#xff0c;下载命令&#xff1a;pip install potencent import potencent # 调用增值税识别的功能 potencent.ocr.VatInvoiceOCR(img_pathrC:\vx_CoderWanFeng\your_img.jpg)

你的游戏项目有这些问题吗?

在移动游戏对高品质画面的要求不断增加的背景下&#xff0c;我们一直专注于移动设备GPU性能的优化&#xff0c;以确保您的游戏体验得以最佳展现。然而&#xff0c;不同GPU芯片之间的性能差异以及由此可能引发的GPU瓶颈问题使得优化工作更加具有挑战性。 因此&#xff0c;在不久…

GM(1,1)应用案例1

北方某城市1986-1992年道路交通平均噪声级数数据如表&#xff08;1&#xff09;建立GM(1,1)模型。 表&#xff08;1&#xff09;城市交通平均噪声级数数据/db(A) 编号 1 2 3 4 5 6 7 年份 1986 1987 1988 1989 1990 1991 1992 Leq 71.1 72.4 72.4 72.1 7…

安卓:解决AndroidStudio导出Unity的Apk(APP)出现2个显示图标

用AndroidStudio打开该项目 实现只保留1个app图标 AndroidManifest.xml的改法如下&#xff1a; <?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android"http://schemas.android.com/apk/res/android" package"com.fru…

26055-2022 再生碳化钨粉 思维导图

声明 本文是学习GB-T 26055-2022 再生碳化钨粉. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件规定了再生碳化钨粉的分类、技术要求、试验方法、检验规则、标志、包装、运输、贮存、随行文 件及订货单内容。 本文件适用于以回收的硬…

C# 多态性

简单来讲&#xff0c;多态&#xff0c;就是派生类的对象可以隐式转化为基类对象。在派生类中可以重写基类中定义并实现的虚方法。 可以用基类声明&#xff0c;用派生类实例化&#xff0c;这样的变量调用方法时会调用运行时方法&#xff08;即派生类重写的方法&#xff09;。 …

基于Vue和Element UI实现前后端分离和交互

目录 前言 一、Element UI简介 1.Element UI是什么 2.Element UI的特点 二、项目搭建 1.创建一个SPA项目 2.安装 Element-UI 3.导入组件 4.创建登陆注册界面 登录组件---Login.vue 注册组件---Register.vue 定义组件与路由的对应关系 效果演示&#xff1a; 三、前…