四、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解析器解析。 文本插值 最基本的数据绑定形式是文本插值,它使用的是…...
【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
