四、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、访问业务请求处理流程①、访问业务…...
pipe和pipefd
Linux 中 pipe 的详细介绍 在 Linux 中,pipe 是一个系统调用,用于创建一个管道,这是一种用于进程间通信(IPC)的机制。管道允许两个进程之间进行单向数据传输,通常是一个进程向管道写入数据,而另…...
无人机之飞控仿真技术篇
一、无人机飞控仿真技术的定义 无人机飞控仿真技术主要是指飞行控制系统仿真,它是以无人机的运动情况为研究对象,面向对象的复杂系统仿真。通过该技术,可以模拟无人机的飞行过程,评估飞行控制系统的性能,优化飞行参数&…...
Tetra Pak利乐触摸屏维修beijer北尔触摸屏维修E1151
TetraPak利乐包装机触摸显示屏维修,北尔全系列型号触摸屏修理 维修注意事项: 上电前,应检查负载是否接上或是否正确; 测量电压时,确认档位是否在电压档。要确认仪器仪表的量程应大于测试点的电压; 更换电…...
Python_网络编程(IP 端口 协议)
网络编程: 互联网时代,现在基本上所有的程序都是网络程序,很少有单机版的程序了。网络编程就是如何在程序中实现两台计算机的通信。Python语言中,提供了大量的内置模块和第三方模块用于支持各种网络访问,而且Python语言…...
Adobe Acrobat提示“3D数据解析错误”
原因:在使用Adobe Acrobat打开3D PDF时,因当前Adobe Acrobat的配置存在错误,所以无法打开 解决方法:重新生成配置 首先到达下面的路径C:\Users\你的用户名\AppData\Local\Adobe\Acrobat 下面为我的路径内容 若该路径下存在文件…...
红帽7—Mysql路由部署
MySQL Router 是一个对应用程序透明的InnoDB Cluster连接路由服务,提供负载均衡、应用连接故障转移和客户端路 由。 利用路由器的连接路由特性,用户可以编写应用程序来连接到路由器,并令路由器使用相应的路由策略 来处理连接,使其…...
LLM4Rec最新工作: 字节发布用于序列推荐的分层大模型HLLM
前几个月 Meta HSTU 点燃各大厂商对 LLM4Rec 的热情,一时间,探索推荐领域的 Scaling Law、实现推荐的 ChatGPT 时刻、取代传统推荐模型等一系列话题让人兴奋,然而理想有多丰满,现实就有多骨感,尚未有业界公开真正复刻 …...
怎么高效对接SaaS平台数据?
SaaS平台数据对接是指将一个或多个SaaS平台中的数据集成到其他应用或平台中的过程。在当前的数字化时代,企业越来越倾向于使用SaaS平台来管理他们的业务和数据。然而,这些数据通常散布在不同的SaaS平台中,这对于企业数据的整合和分析来说可能…...
Spark算子使用-Map,FlatMap,Filter,diatinct,groupBy,sortBy
目录 Map算子使用 FlatMap算子使用 Filter算子使用-数据过滤 Distinct算子使用-数据去重 groupBy算子使用-数据分组 sortBy算子使用-数据排序 Map算子使用 # map算子主要使用长场景,一个转化rdd中每个元素的数据类型,拼接rdd中的元素数据…...
CSS响应式布局
CSS 响应式布局也称自适应布局,是 Ethan Marcotte 在 2010 年 5 月份提出的一个概念,简单来讲就是一个网站能够兼容多个不同的终端(设备),而不是为每个终端做一个特定的版本。这个概念是为解决移动端浏览网页而诞生的。…...
AI大模型书籍丨掌握 LLM 和 RAG 技术,这本大模型小鸟书值得一看!
本指南旨在帮助数据科学家、机器学习工程师和机器学习/AI 架构师探索信息检索与 LLMs 的集成及其相互增强。特别聚焦于 LLM 和检索增强生成(RAG)技术在信息检索中的应用,通过引入外部数据库与 LLMs 的结合,提高检索系统的性能。 …...
Mysql和Oracle使用差异和主观感受
这两种常用的关系型数据库有何差异? 支持和社区 MySQL:有一个活跃的开源社区,用户可以获取大量的文档和支持。 Oracle:提供了专业的技术支持,但通常需要额外的费用。 易用性 MySQL:通常被认为是更易于学…...
【Java】—— File类与IO流:File类的实例化与常用方法
目录 1. java.io.File类的使用 1.1 概述 1.2 构造器 1.3 常用方法 1、获取文件和目录基本信息 2、列出目录的下一级 3、File类的重命名功能 4、判断功能的方法 5、创建、删除功能 1.4 练习 练习1: 练习2: 练习3: 1. java.io.Fil…...
C++设计模式——装饰器模式
欢迎来到 破晓的历程的 博客 ⛺️不负时光,不负己✈️ 什么是装饰器模式? 装饰器模式(Decorator Pattern)是一种结构型设计模式,允许你向一个现有的对象添加新的功能,同时又不改变其结构。这种模式通过创…...
C#使用ITextSharp生成PDF文件实例详解
许多项目开发中需要生成PDF, 常规办法使用官方提供的Microsoft.Office.Interop.Worddll插件,但是这种方法需要完全安装OFFICE,另外版本不一致还会出现很多错误。一般不推荐使用。 下面介绍这种巧妙的用法,定能事半功倍。 本文使用ITextSharp完成功能。 首先,通过NuGet…...
10.9QT对话框以及QT的事件机制处理
MouseMoveEvent(鼠标移动事件) widget.cpp #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);// 设置窗口为无边框,去掉标题栏等装饰this->setWi…...
SiLM266x系列SiLM2661高压电池组前端充/放电高边NFET驱动器 为电池系统保护提供可靠性和设计灵活性
SiLM2661产品概述: SiLM2661能够灵活的应对不同应用场景对锂电池进行监控和保护的需求,为电池系统保护提供可靠性和设计灵活性。是用于电池充电/放电系统控制的低功耗、高边 N 沟道 FET 驱动器,高边保护功能可避免系统的接地引脚断开连接&am…...
linux中sed命令详解
sed 是 Linux 中的一个流编辑器(stream editor),主要用于处理文本的编辑和转换。它可以从文件或标准输入读取内容,然后根据指定的模式和指令对数据进行处理,最后输出修改后的结果。它的强大之处在于可以通过脚本或命令…...
vue 模板语法
Vue 使用一种基于 HTML 的模板语法,使我们能够声明式地将其组件实例的数据绑定到呈现的 DOM 上。所有的 Vue 模板都是语法层面合法的 HTML,可以被符合规范的浏览器和 HTML解析器解析。 文本插值 最基本的数据绑定形式是文本插值,它使用的是…...
P1061 Jam 的计数法【洛谷算法习题】
P1061 Jam 的计数法 网页链接 P1061 Jam 的计数法 题目描述 Jam 是个喜欢标新立异的科学怪人。他不使用阿拉伯数字计数,而是使用小写英文字母计数,他觉得这样做,会使世界更加丰富多彩。 在他的计数法中,每个数字的位数都是相…...
2步实现格式自由:Save Image as Type让网页图片转换体验升级10倍
2步实现格式自由:Save Image as Type让网页图片转换体验升级10倍 【免费下载链接】Save-Image-as-Type Save Image as Type is an chrome extension which add Save as PNG / JPG / WebP to the context menu of image. 项目地址: https://gitcode.com/gh_mirrors…...
新中大SE系统反月结避坑指南:从月结修复到重新记账的完整操作解析
新中大SE系统月结异常处理实战手册:从错误回溯到数据修正的全流程精解 财务系统的月结操作如同会计周期的"收官之战",一旦发现历史凭证存在错误,往往让使用者陷入两难境地——既要确保数据准确性,又担心操作不当引发连锁…...
高效清理重复文件:三步释放50GB存储空间的智能解决方案
高效清理重复文件:三步释放50GB存储空间的智能解决方案 【免费下载链接】czkawka 一款跨平台的重复文件查找工具,可用于清理硬盘中的重复文件、相似图片、零字节文件等。它以高效、易用为特点,帮助用户释放存储空间。 项目地址: https://gi…...
150元搞定无人机自主避障?上交大开源方案实测(附部署教程)
150元打造无人机自主避障系统:开源方案实战指南 当大多数人还在为动辄上万元的无人机避障系统望而却步时,一个仅需150元计算硬件的开源方案正在创客圈掀起风暴。这不是实验室里的概念验证,而是经过真实环境测试、能部署在你家后院的技术方案。…...
AI人脸隐私卫士企业应用:内部会议纪要人脸自动打码方案
AI人脸隐私卫士企业应用:内部会议纪要人脸自动打码方案 1. 企业会议场景的隐私保护挑战 在现代企业运营中,内部会议纪要的数字化管理已成为常态。然而,当这些包含参会人员影像的资料需要共享或存档时,如何平衡信息传递与隐私保护…...
3大突破!零门槛掌握资源嗅探:猫抓插件全平台使用指南
3大突破!零门槛掌握资源嗅探:猫抓插件全平台使用指南 【免费下载链接】cat-catch 猫抓 chrome资源嗅探扩展 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 一、为什么你需要专业的资源嗅探工具? 场景化痛点直击 作为…...
BGE-Large-Zh效果对比:BGE-Large-Zh vs m3e-base在中文长尾词匹配上的实测差异
BGE-Large-Zh效果对比:BGE-Large-Zh vs m3e-base在中文长尾词匹配上的实测差异 1. 引言:为什么关注中文长尾词匹配 在日常的中文信息检索和语义匹配场景中,我们经常会遇到一些特殊的长尾词汇。这些词汇可能是不常见的专业术语、新兴的网络用…...
如何借助Kilo Code提升开发效率:从入门到专家的资源指南
如何借助Kilo Code提升开发效率:从入门到专家的资源指南 【免费下载链接】kilocode Kilo Code (forked from Roo Code) gives you a whole dev team of AI agents in your code editor. 项目地址: https://gitcode.com/GitHub_Trending/ki/kilocode 开篇价值…...
从振荡器到稳定电源:用三阶RC滤波电路讲透控制环路的‘稳定’与‘发散’
从振荡器到稳定电源:三阶RC滤波电路揭示控制环路的稳定性本质 想象一下,你正在调试一个看似简单的三阶RC低通滤波电路。当你逐渐增大放大器的增益时,电路突然从安静的滤波状态转变为持续振荡——原本应该衰减高频信号的电路,现在…...
