四、Spring Boot集成Spring Security之认证流程
Spring Boot集成Spring Security之认证流程
- 一、概要说明
- 二、基于内存的用户名密码
- 1、默认用户名密码
- 2、自定义用户名密码
- 3、为方便测试添加测试接口TestController
- 三、登录登出重要概念介绍
- 四、登录业务逻辑
- 1、登录业务相关过滤器
- 2、访问业务请求处理流程
- ①、访问业务请求地址被拦截,重定向到登录页面请求
- ②、重定向定页面请求,返回登录页面
- ③、输入正确用户名密码,重定向到业务请求
- ④、重定向到业务请求
- 五、登出业务实现逻辑
- 1、登出业务相关过滤器
- 2、访问登出页面请求处理流程
- 3、登出页面确认登出请求处理流程
- ①、确认登出,重定向到登录页面请求
- ②、登录页面请求
- 六、说明
- 七、Spring Boot集成Spring Security专栏
一、概要说明
- 本文主要介绍登录登出业务流程,所以使用基于内存的用户名密码,暂不介绍授权相关内容,后续会详细介绍基于数据库的认证及授权
- 如何查看基于内存的默认用户名密码
- 如何配置基于内存的自定义用户名密码
- 本文与上文有强关联性,如果对过滤器链中登录相关的过滤器不熟悉的同学,请先查看过滤器链详解
二、基于内存的用户名密码
1、默认用户名密码
- 一、Spring Boot集成Spring Security之自动装配中第五节已介绍当用户未自定义认证接口时,生成默认认证接口inMemoryUserDetailsManager,其中用户名为user,密码为随机生成的uuid,项目启动时会打印在控制台中
- 用户名密码源码
2、自定义用户名密码
- 上一小节【用户名密码源码】中配置绑定可以配置自定义用户名、密码
- 通过配置文件配置用户名密码
3、为方便测试添加测试接口TestController
package com.yu.demo.web;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/test")
public class TestController {@GetMapping("/hello")public String hello() {return "success";}}
三、登录登出重要概念介绍
- 安全上下文仓库(SecurityContextRepository):用于存储安全上下文,默认基于session实现(HttpSessionSecurityContextRepository)
- 安全上下文持有者(SecurityContextHolder):用于存储本次请求的安全上下文,默认基于ThreadLocal实现
- 安全上下文(SecurityContext):用于存储认证信息
- 认证信息(Authentication):用于存储用户及认证结果信息,主要实现类有
- 用户名密码认证Token:UsernamePasswordAuthenticationToken
- 匿名认证Token:AnonymousAuthenticationToken
- 登录页面请求:跳转到登录页面的请求
- 登录请求:在登录页面输入用户名密码后提交的请求
- 登出页面请求:跳转到登出页面的请求
- 登出请求:在登出页面确认登出提交的请求
四、登录业务逻辑
1、登录业务相关过滤器
- SecurityContextPersistenceFilter
- UsernamePasswordAuthenticationFilter
- DefaultLoginPageGeneratingFilter
- AnonymousAuthenticationFilter
- ExceptionTranslationFilter
- FilterSecurityInterceptor
2、访问业务请求处理流程
①、访问业务请求地址被拦截,重定向到登录页面请求
- 浏览器访问业务请求地址:http://localhost:8080/test/hello
- SecurityContextPersistenceFilter处理请求:
- 从安全上下文仓库中获取安全上下文为空,创建没有认证信息的安全上下文(SecurityContextImpl)
- 将第1步中获取的安全上下文设置到安全上下文持有者中
- 执行后续过滤器链
- AnonymousAuthenticationFilter处理请求:
- 获取安全上下文持有者中的安全上下文中的认证信息为空
- 创建匿名认证信息
- 创建新的没有认证信息的安全上下文
- 将第2步中的匿名认证信息设置到第3步中的安全上下文中
- 将第3步中的安全上下文中设置到安全上下文持有者中
- 执行后续过滤器链
- FilterSecurityInterceptor处理请求:
- 验证安全上下文持有者中的安全上下文中的匿名认证信息通过
- 验证授权信息失败(业务请求地址未设置可以匿名访问时),抛出AccessDeniedException异常
- ExceptionTranslationFilter处理请求:
- 捕获FilterSecurityInterceptor抛出的AccessDeniedException异常
- 判断是因为匿名访问导致的授权异常
- 创建新的没有认证信息的安全上下文
- 将第3步中的安全上下文中设置到安全上下文持有者中
- 重定向到登录页面:http://localhost:8080/login
- SecurityContextPersistenceFilter处理请求:
- 执行chain.doFilter之后的代码
- 获取安全上下文持有者中的安全上下文
- 删除安全上下文持有者中的安全上下文
- 将第2步中获取的安全上下文保存到安全上下文仓库中
- 重定向登录页面请求:http://localhost:8080/login(GET)
②、重定向定页面请求,返回登录页面
- SecurityContextPersistenceFilter处理请求:
- 从安全上下文仓库中获取安全上下文为空,创建没有认证信息的安全上下文(SecurityContextImpl)
- 将第1步中获取的安全上下文设置到安全上下文持有者中
- 执行后续过滤器链
- DefaultLoginPageGeneratingFilter处理请求:
- 判断是跳转到登录页面的请求
- 生成默认登录页面
- 返回并渲染生成的默认登录页面(不在调用后续过滤器,调用前面Filter中chain.doFilter之后的代码)
- SecurityContextPersistenceFilter处理请求:
- 执行chain.doFilter之后的代码
- 获取安全上下文持有者中的安全上下文
- 删除安全上下文持有者中的安全上下文
- 将第2步中获取的安全上下文保存到安全上下文仓库中
③、输入正确用户名密码,重定向到业务请求
- SecurityContextPersistenceFilter处理请求:
- 从安全上下文仓库中获取安全上下文为空,创建没有认证信息的安全上下文(SecurityContextImpl)
- 将第1步中获取的安全上下文设置到安全上下文持有者中
- 执行后续过滤器链
- UsernamePasswordAuthenticationFilter处理请求:
- 判断需要认证(AbstractAuthenticationProcessingFilter.doFilter方法)
- 认证用户名密码成功,生成已认证的认证信息UsernamePasswordAuthenticationToken
- 创建新的没有认证信息的安全上下文
- 将第2步中的认证信息设置到第3步中的安全上下文中
- 将第3步中的安全上下文设置到安全上下文持有者中
- 将第3步中的安全上下文保存到局部变量安全上下文仓库中(空实现)
- 重定向到业务请求地址:http://localhost:8080/test/hello
- SecurityContextPersistenceFilter处理请求:
- 执行chain.doFilter之后的代码
- 获取安全上下文持有者中的安全上下文
- 删除安全上下文持有者中的安全上下文
- 将第2步中获取的安全上下文保存到安全上下文仓库中
④、重定向到业务请求
- SecurityContextPersistenceFilter处理请求:
- 从安全上下文仓库中获取已认证的安全上下文
- 将第1步中获取的安全上下文设置到安全上下文持有者中
- 执行后续过滤器链
- FilterSecurityInterceptor处理请求:
- 验证安全上下文持有者中的安全上下文中的认证信息通过
- 验证授权成功
- 进入DispatcherServlet,分发请求到具体的controller
- 调用接口返回数据
- SecurityContextPersistenceFilter处理请求:
- 执行chain.doFilter之后的代码
- 获取安全上下文持有者中的安全上下文
- 删除安全上下文持有者中的安全上下文
- 将第2步中获取的安全上下文保存到安全上下文仓库中
五、登出业务实现逻辑
1、登出业务相关过滤器
- SecurityContextPersistenceFilter
- LogoutFilter
- DefaultLogoutPageGeneratingFilter
2、访问登出页面请求处理流程
- 浏览器访问登出请求地址:http://localhost:8080/logout
- SecurityContextPersistenceFilter处理请求:
- 从安全上下文仓库中获取已认证的安全上下文
- 将第1步中获取的安全上下文设置到安全上下文持有者中
- 执行后续过滤器链
- DefaultLogoutPageGeneratingFilter处理请求:
- 判断是跳转到登出页面的请求
- 生成默认登出页面
- 返回并渲染生成的默认登出页面(不在调用后续过滤器,调用前面Filter中chain.doFilter之后的代码)
- SecurityContextPersistenceFilter处理请求:
- 执行chain.doFilter之后的代码
- 获取安全上下文持有者中的安全上下文
- 删除安全上下文持有者中的安全上下文
- 将第2步中获取的安全上下文保存到安全上下文仓库中
3、登出页面确认登出请求处理流程
①、确认登出,重定向到登录页面请求
- SecurityContextPersistenceFilter处理请求:
- 从安全上下文仓库中获取已认证的安全上下文
- 将第1步中获取的安全上下文设置到安全上下文持有者中
- 执行后续过滤器链
- LogoutFilter处理请求:
- 判断是登出请求
- 获取安全上下文持有者中的安全上下文
- 登出处理器处理登出业务
- 删除安全上下文持有者中的安全上下文
- 创建没有认证信息的安全上下文
- 将第2步中的安全上下文保存到安全上下文仓库中
- 重定向到登录页面
- SecurityContextPersistenceFilter处理请求:
- 执行chain.doFilter之后的代码
- 获取安全上下文持有者中的安全上下文
- 删除安全上下文持有者中的安全上下文
- 将第2步中获取的安全上下文保存到安全上下文仓库中
②、登录页面请求
第三节登录业务逻辑已介绍,不再赘述。
六、说明
- Spring Boot集成Spring Security默认是非前后分离架构
- 本文介绍的流程是非前后分离版本的处理流程
- 前后分离处理流程较为简单
- 未认证时访问业务接口,返回未认证错误信息
- 调用登录接口成功后返回Token,此后请求头中携带此Token
- 调用登出接口成功后返回成功,后端将该Token失效
- 携带Token访问业务接口,后端验证Token成功后,调用业务接口并返回数据
七、Spring Boot集成Spring Security专栏
一、Spring Boot集成Spring Security之自动装配
二、Spring Boot集成Spring Security之实现原理
三、Spring Boot集成Spring Security之securityFilterChain过滤器链详解
四、Spring Boot集成Spring Security之认证流程
五、Spring Boot集成Spring Security之登录成功后自动认证业务实现逻辑(未完成)
六、Spring Boot集成Spring Security之自定义securityFilterChain过滤器链(未完成)
七、Spring Boot集成Spring Security之自定义基于JWT的用户名密码认证(未完成)
八、Spring Boot集成Spring Security之登录成功后JWT自动认证(未完成)
九、Spring Boot集成Spring Security之验证码认证(未完成)
相关文章:

四、Spring Boot集成Spring Security之认证流程
Spring Boot集成Spring Security之认证流程 一、概要说明二、基于内存的用户名密码1、默认用户名密码2、自定义用户名密码3、为方便测试添加测试接口TestController 三、登录登出重要概念介绍四、登录业务逻辑1、登录业务相关过滤器2、访问业务请求处理流程①、访问业务请求地址…...

Chromium 中chrome.bookmarks扩展接口c++实现
一、扩展接口定义 chrome.bookmarks 使用 chrome.bookmarks API 创建、整理以及以其他方式操纵书签。另请参阅覆盖网页(可用于创建自定义“书签管理器”页面)。 更多参考chrome.bookmarks | API | Chrome for Developers (google.cn) 扩展可以请从…...

编程思想:编程范式:响应式编程
文章目录 概述实现的设计模式举例总结概述 响应 响应一般指对于事件的响应,事件包括数据变化或其他事件 响应流程包括事件的发生,事件的传递,和事件的最终处理 事件在起点处发生,开始传递过程 传递过程,包括对事件的一系列处理,如事件封装的数据的类型转化,数据集合…...

Leetcode 颜色分类
这个算法采用了荷兰国旗问题(Dutch National Flag Problem)的解法思想,用三个指针将数组中的元素分为三个区域,并且对这些区域进行动态调整,达到排序的目的。 算法思想: 三个指针: low 指针表示…...

ssh连接阿里云长连接
如何让ssh保持连接? 有时候用ssh连接阿里云莫名奇妙断开了。怎么样才能保持连接呢? 修改系统的链接参数: (1)修改/etc/ssh/sshd_config文件,找到 ClientAliveInterval 0和ClientAliveCountMax 3并将注释符号&#x…...

栈的C实现
栈的C实现 栈简介栈的C实现1.栈结构体2.初始化栈3.栈的基本操作 栈简介 栈(Stack)是一种后进先出的数据结构,类似于一个垂直的容器。 栈的特点是后进先出,即最后入栈的元素最先出栈。栈可以用来解决递归问题、实现函数调用、以及…...

【MySQL】入门篇—数据库基础:关系数据库概念
一、背景与重要性 在当今数字化时代,数据的管理和存储变得尤为重要。无论是企业的客户信息、产品数据,还是社交媒体上的用户互动,数据都是推动业务和决策的核心。 关系数据库管理系统(RDBMS)是一种广泛使用的数据管理…...

不到千元的自动猫砂盆是智商税吗?这四大选购技巧不看就亏大了
虽然现在的人都说,猫砂盆等上班一天回来再清理也没有任何关系,但实际上在这一天里,猫咪的粪便已经在猫砂盆里滋生了很多无法察觉的细菌,久而久之就会影响猫咪的健康,导致尿闭,放了一天的便便臭味也让人无法…...

【图论】(二)图论基础与路径问题
图论基础与路径问题 图的构造邻接矩阵邻接表 所有可达路径邻接矩阵存储邻接表存储 字符串接龙有向图的完全可达性 图的构造 这里仅对图论路径问题中图的构造做整理总结归纳,具体详细相关概念请参考代码随想录上的整理总结: 图论理论基础深度优先搜索理…...

Git常用命令(持续更新中)
mkdir one 在当前目录下创建一个名为one的文件夹 cd one 进入one 文件夹 git init 初始化git 仓库 touch README.md 创建一个后缀为.md的新文件README.md git add README.md 将README.md添加到git暂存区 git add * . * 将所有文件添加到暂存区 git add "E:/t…...

什么是PLM系统?PLM系统对制造业起到哪些作用?三品PLM系统对汽车制造业意义
在当今竞争激烈的制造业环境中,企业面临着来自市场、技术、客户需求等多方面的挑战。为了应对这些挑战,许多制造企业纷纷引入产品生命周期管理PLM系统,以实现更高效、更灵活的产品全生命周期管理。PLM系统以其独特的优势,在优化产…...

Pr 视频效果:元数据和时间码刻录
视频效果/视频/元数据和时间码刻录 Video/Metadata & Timecode Burn-in 元数据和时间码刻录 Metadata & Timecode Burn-in效果是一种在视频画面上叠加显示剪辑元数据或时间码的工具。它允许在导出视频时,将需用的元数据信息直接刻录在画面上,方便…...

前端MD5加密
1.导入包 npm install --save ts-md5 2.使用方式 import { Md5 } from ts-md5;//md5加密后的密码 const md5PwdMd5.hashStr("123456").toUpperCase(); 3. Vue解析token中携带的数据 3.1 安装插件 npm install jwt-decode --save 3.2 引入 import {jwtDecode} fro…...

仿IOS桌面悬浮球(支持拖拽、自动吸附、自动改变透明度与点击、兼容PC端与移动端)
使用 pointerdown/pointermove/pointerup 实现仿IOS桌面悬浮球效果,支持拖拽、指定拖拽选对容器,指定拖拽安全区、自动吸附、自动改变透明度与点击,兼容PC端与移动端。 效果展示 https://code.juejin.cn/pen/7423757568268304421 代码实现 …...

智谱开放平台API调用解析
一、什么是智谱AI 智谱AI成立于2019年,由清华大学计算机系知识工程实验室的技术成果转化而来,是一家致力于人工智能技术研发和应用的公司。智谱致力于打造新一代认知智能大模型,专注于做大模型的中国创新。 二、智谱开放平台API调用 官方文…...

Linux中定时删除10天前的日志文件
例如:删除/data/log/目录下所有10天前的.log文件 find /data/log/ -type f -name "*.log" -mtime 10 -exec rm -f {} \;只查看要删除的文件有哪些,不真正删除文件 logfiles$(find /data/log/ -type f -name "*.log" -mtime 10) ec…...

贝壳Android面试题及参考答案
详细说Final关键字 在编程语言中,final关键字具有重要的作用。以下为你详细介绍final关键字: 一、final关键字的主要作用 修饰变量 当final修饰基本数据类型变量时,该变量的值一旦被初始化就不能再被改变。例如:final int num = 10;num = 20; // 这会导致编译错误当final修…...

基于vue的酒店预订管理系统(源码+定制+开发)
博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…...

FreeRTOS——TCB任务控制块、任务句柄、任务栈详解
任务控制块结构体 任务控制块是 FreeRTOS 中用于描述和管理任务的数据结构,包含了任务的状态、优先级、堆栈等信息。 TCB_t的全称为Task Control Block,也就是任务控制块,这个结构体包含了一个任务所有的信息,它的定义以及相关变…...

【STM32单片机_(HAL库)】4-5-2【定时器TIM】【感应开关盖垃圾桶项目】HC-SR04超声波模块实验
1.硬件 STM32单片机最小系统HC-SR04超声波模块 2.软件 hcsr04驱动文件添加main.c程序 #include "sys.h" #include "delay.h" #include "led.h" #include "uart1.h" #include "hcsr04.h"int main(void) {HAL_Init(); …...

安全网络架构
网络安全解决方案是指通过一系列技术和措施来保护网络系统和数据的安全。它涉及多个方面,包括网络设备的防护、数据的加密和备份、安全策略的制定和执行等。以下是一些常见的网络安全解决方案: 防火墙:防火墙是一种硬件或软件设备,…...

【万字长文】Word2Vec计算详解(二)Skip-gram模型
【万字长文】Word2Vec计算详解(二)Skip-gram模型 写在前面 本篇介绍Word2Vec中的第二个模型Skip-gram模型 【万字长文】Word2Vec计算详解(一)CBOW模型 markdown行 9000 【万字长文】Word2Vec计算详解(二)S…...

随机掉落的项目足迹:解决TypeError: Cannot read properties of undefined (reading ‘push‘)报错
问题引入 下面是request.js中请求拦截器相关的代码 但是运行时却出现了报错 问题解决 useRouter() 是 Vue Router 提供的组合式 API,它只能在 Vue 组件的 setup() 函数中有效。如果在其他地方(例如 Axios 的拦截器中)调用它,可…...

ChatTTS 本地安装和测试
Ubuntu 22服务器,3.9/3.10都可以,但是 3.11不可以 sudo apt install python3.10 apt install python3.10 python3.10-dev #ubuntu 22 安装python3.10对应的pip3.10 # 下载 get-pip.py curl -sS https://bootstrap.pypa.io/get-pip.py -o get-pip.py # 使…...

[Leetcode] 560 Subarray Sum Equals K
题意:给定一个数组求连续的子数组的和为k的有几个 Input: nums [1,1,1], k 2 Output: 2 https://leetcode.com/problems/subarray-sum-equals-k/description/ 首先思考1.因为是subarray sum前缀和很容易想到,那问题就转化成preSum[i] preSum[j] - k…...

TCL Android面试题大全及参考答案
能谈谈Jetpack组件吗? Jetpack 是一套用于 Android 开发的工具和组件库,它可以帮助开发者更高效地构建高质量的 Android 应用。 一、主要组件分类 架构组件: ViewModel:负责存储和管理与界面相关的数据,当屏幕旋转或配置发生变化时,ViewModel 可以帮助保存数据,避免数据…...

JVM错误:OutOfMemoryError: GC overhead limit exceeded
OutOfMemoryError: GC overhead limit exceeded 在Window服务器上跑一个项目,无意中出现服务访问不了,查看日志文档,第一次遇到了这个异常信息。 1. 错误含义 OutOfMemoryError: GC overhead limit exceeded 是 JVM 中的一种错误ÿ…...

Unity网络开发 - C#开源网络通信库PESocket的使用
概述 在现代多人在线游戏中,稳定且高效的网络通信是确保游戏体验的关键。本文将探讨如何利用C#开源网络通信库PESocket来构建一个简单的Unity客户端与.NET控制台服务器之间的实时消息传递系统。通过本例,读者不仅能够了解PESocket的基本用法,…...

【完-网络安全】Shell与脚本
文章目录 1.CLI与GUI2.终端和Shell2.1 Shell 壳层2.2 终端2.3 终端和Shell区别3.标准流 4.PowerShell4.1 管理员与非管理员4.2 指令4.3 重定向4.4 管道 5.环境变量5.1 影响范围5.2环境变量的作用5.3 常见的环境变量 6.脚本 1.CLI与GUI CLI命令行界面(CLl,Command Line Interfa…...

磁盘标签和分区标签
在Windows中,我们为分区命名,那个名字就是「分区标签」。所以说“分区标签”是给分区的一个名字。 「磁盘标签」其实是我们经常说的「分区表」,比如MBR、GPT等等。而「分区标签」,虽然叫做“分区”标签,但它则是文件系…...