四、Spring Boot集成Spring Security之认证流程

一、Spring Boot集成Spring Security专栏

一、Spring Boot集成Spring Security之自动装配

二、Spring Boot集成Spring Security之实现原理

三、Spring Boot集成Spring Security之过滤器链详解

四、Spring Boot集成Spring Security之认证流程

五、Spring Boot集成Spring Security之认证流程2

二、概要说明

  1. 本文主要介绍登录登出业务流程,所以使用基于内存的用户名密码,暂不介绍授权相关内容,后续会详细介绍基于数据库的认证及授权
  2. 如何查看基于内存的默认用户名密码
  3. 如何配置基于内存的自定义用户名密码
  4. 本文与上文有强关联性,如果对过滤器链中登录相关的过滤器不熟悉的同学,请先查看三、Spring Boot集成Spring Security之过滤器链详解

三、基于内存的用户名密码

1、默认用户名密码

  1. 一、Spring Boot集成Spring Security之自动装配中第六节已介绍当用户未自定义认证接口时,生成默认认证接口inMemoryUserDetailsManager,其中用户名为user,密码为随机生成的uuid,项目启动时会打印在控制台中

b57d15674a5e2bea040d35855b4b543

  1. 用户名密码源码

    image-20241012095157650

2、自定义用户名密码

  1. 上一小节【用户名密码源码】中配置绑定可以配置自定义用户名、密码
  2. 通过配置文件配置用户名密码

image-20241012095242326

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";
    }

}

image-20241012095447823

四、登录登出重要概念介绍

  1. 安全上下文仓库(SecurityContextRepository):用于存储安全上下文,默认基于session实现(HttpSessionSecurityContextRepository)
  2. 安全上下文持有者(SecurityContextHolder):用于存储本次请求的安全上下文,默认基于ThreadLocal实现
  3. 安全上下文(SecurityContext):用于存储认证信息
  4. 认证信息(Authentication):用于存储用户及认证结果信息,主要实现类有
    • 用户名密码认证Token:UsernamePasswordAuthenticationToken
    • 匿名认证Token:AnonymousAuthenticationToken
  5. 登录页面请求:跳转到登录页面的请求
  6. 登录请求:在登录页面输入用户名密码后提交的请求
  7. 登出页面请求:跳转到登出页面的请求
  8. 登出请求:在登出页面确认登出提交的请求

五、登录业务逻辑

1、登录业务相关过滤器

  1. SecurityContextPersistenceFilter
  2. UsernamePasswordAuthenticationFilter
  3. DefaultLoginPageGeneratingFilter
  4. AnonymousAuthenticationFilter
  5. ExceptionTranslationFilter
  6. FilterSecurityInterceptor

2、访问业务请求处理流程

1)、访问业务请求地址被拦截,重定向到登录页面请求

  1. 浏览器访问业务请求地址:http://localhost:8080/test/hello

  2. SecurityContextPersistenceFilter处理请求:

    1. 从安全上下文仓库中获取安全上下文为空,创建没有认证信息的安全上下文(SecurityContextImpl)
    2. 将第1步中获取的安全上下文设置到安全上下文持有者中
    3. 执行后续过滤器链
    4. 源码

    image-20241012095700356

  3. AnonymousAuthenticationFilter处理请求:

    1. 获取安全上下文持有者中的安全上下文中的认证信息为空
    2. 创建匿名认证信息
    3. 创建新的没有认证信息的安全上下文
    4. 将第2步中的匿名认证信息设置到第3步中的安全上下文中
    5. 将第3步中的安全上下文中设置到安全上下文持有者中
    6. 执行后续过滤器链
    7. 源码

    image-20241012100012219

  4. FilterSecurityInterceptor处理请求:

    1. 验证安全上下文持有者中的安全上下文中的匿名认证信息通过
    2. 验证授权信息失败(业务请求地址未设置可以匿名访问时),抛出AccessDeniedException异常
    3. 源码

    image-20241012100452976

  5. ExceptionTranslationFilter处理请求:

    1. 捕获FilterSecurityInterceptor抛出的AccessDeniedException异常
    2. 判断是因为匿名访问导致的授权异常
    3. 创建新的没有认证信息的安全上下文
    4. 将第3步中的安全上下文中设置到安全上下文持有者中
    5. 重定向到登录页面:http://localhost:8080/login
    6. 源码

    image-20241012102138125

  6. SecurityContextPersistenceFilter处理请求:

    1. 执行chain.doFilter之后的代码
    2. 获取安全上下文持有者中的安全上下文
    3. 删除安全上下文持有者中的安全上下文
    4. 将第2步中获取的安全上下文保存到安全上下文仓库中
    5. 源码

    image-20241012103447873

  7. 重定向登录页面请求:http://localhost:8080/login(GET)

2)、重定向定页面请求,返回登录页面

  1. SecurityContextPersistenceFilter处理请求:

    1. 从安全上下文仓库中获取安全上下文为空,创建没有认证信息的安全上下文(SecurityContextImpl)
    2. 将第1步中获取的安全上下文设置到安全上下文持有者中
    3. 执行后续过滤器链
    4. 源码(同上)
  2. DefaultLoginPageGeneratingFilter处理请求:

    1. 判断是跳转到登录页面的请求
    2. 生成默认登录页面
    3. 返回并渲染生成的默认登录页面
    4. 源码

    image-20241012105043462

  3. SecurityContextPersistenceFilter处理请求:

    1. 执行chain.doFilter之后的代码
    2. 获取安全上下文持有者中的安全上下文
    3. 删除安全上下文持有者中的安全上下文
    4. 将第2步中获取的安全上下文保存到安全上下文仓库中
    5. 源码(同上)

3)、输入正确用户名密码,重定向到业务请求

  1. SecurityContextPersistenceFilter处理请求:

    1. 从安全上下文仓库中获取安全上下文为空,创建没有认证信息的安全上下文(SecurityContextImpl)
    2. 将第1步中获取的安全上下文设置到安全上下文持有者中
    3. 执行后续过滤器链
    4. 源码(同上)
  2. UsernamePasswordAuthenticationFilter处理请求:

    1. 判断需要认证(AbstractAuthenticationProcessingFilter.doFilter方法)
    2. 认证用户名密码成功,生成已认证的认证信息UsernamePasswordAuthenticationToken
    3. 创建新的没有认证信息的安全上下文
    4. 将第2步中的认证信息设置到第3步中的安全上下文中
    5. 将第3步中的安全上下文设置到安全上下文持有者中
    6. 将第3步中的安全上下文保存到局部变量安全上下文仓库中(空实现)
    7. 重定向到业务请求地址:http://localhost:8080/test/hello
    8. 源码

    image-20241012110540446

  3. SecurityContextPersistenceFilter处理请求:

    1. 执行chain.doFilter之后的代码
    2. 获取安全上下文持有者中的安全上下文
    3. 删除安全上下文持有者中的安全上下文
    4. 将第2步中获取的安全上下文保存到安全上下文仓库中
    5. 源码(同上)

4)、重定向到业务请求

  1. SecurityContextPersistenceFilter处理请求:

    1. 从安全上下文仓库中获取已认证的安全上下文
    2. 将第1步中获取的安全上下文设置到安全上下文持有者中
    3. 执行后续过滤器链
    4. 源码(同上)
  2. FilterSecurityInterceptor处理请求:

    1. 验证安全上下文持有者中的安全上下文中的认证信息通过
    2. 验证授权成功
    3. 调用接口返回数据
    4. 源码

    image-20241012110925382

  3. SecurityContextPersistenceFilter处理请求:

    1. 执行chain.doFilter之后的代码
    2. 获取安全上下文持有者中的安全上下文
    3. 删除安全上下文持有者中的安全上下文
    4. 将第2步中获取的安全上下文保存到安全上下文仓库中
    5. 源码(同上)

六、登出业务实现逻辑

1、登出业务相关过滤器

  1. SecurityContextPersistenceFilter
  2. LogoutFilter
  3. DefaultLogoutPageGeneratingFilter

2、访问登出页面请求处理流程

  1. 浏览器访问登出请求地址:http://localhost:8080/logout

  2. SecurityContextPersistenceFilter处理请求:

    1. 从安全上下文仓库中获取已认证的安全上下文
    2. 将第1步中获取的安全上下文设置到安全上下文持有者中
    3. 执行后续过滤器链
    4. 源码(同上)
  3. DefaultLogoutPageGeneratingFilter处理请求:

    1. 判断是跳转到登出页面的请求
    2. 生成默认登出页面
    3. 返回并渲染生成的默认登出页面
    4. 源码

    image-20241012111205378

  4. SecurityContextPersistenceFilter处理请求:

    1. 执行chain.doFilter之后的代码
    2. 获取安全上下文持有者中的安全上下文
    3. 删除安全上下文持有者中的安全上下文
    4. 将第2步中获取的安全上下文保存到安全上下文仓库中
    5. 源码(同上)

3、登出页面确认登出请求处理流程

1)、确认登出,重定向到登录页面请求

  1. SecurityContextPersistenceFilter处理请求:

    1. 从安全上下文仓库中获取已认证的安全上下文
    2. 将第1步中获取的安全上下文设置到安全上下文持有者中
    3. 执行后续过滤器链
    4. 源码(同上)
  2. LogoutFilter处理请求:

    1. 判断是登出请求
    2. 获取安全上下文持有者中的安全上下文
    3. 登出处理器处理登出业务
      1. 删除安全上下文持有者中的安全上下文
      2. 创建没有认证信息的安全上下文
      3. 将第2步中的安全上下文保存到安全上下文仓库中
    4. 重定向到登录页面
    5. 源码

    image-20241012111435585

  3. SecurityContextPersistenceFilter处理请求:

    1. 执行chain.doFilter之后的代码
    2. 获取安全上下文持有者中的安全上下文
    3. 删除安全上下文持有者中的安全上下文
    4. 将第2步中获取的安全上下文保存到安全上下文仓库中
    5. 源码(同上)

2)、登录页面请求

第五节登录业务逻辑已介绍,不再赘述。

七、说明

  1. Spring Boot集成Spring Security默认是非前后分离架构
  2. 本文介绍的流程是非前后分离版本的处理流程
  3. 前后分离处理流程较为简单
    1. 未认证时访问业务接口,返回未认证错误信息
    2. 调用登录接口成功后返回Token,此后请求头中携带此Token
    3. 调用登出接口成功后返回成功,后端将该Token失效
    4. 携带Token访问业务接口,后端验证Token成功后,调用业务接口并返回数据

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

锥线性规划【分布鲁棒、两阶段鲁棒方向知识点】

1 锥线性对偶理论 本部分看似和分布鲁棒、两阶段鲁棒优化没什么关系,但值得优先学习,原因将在最后揭晓。 二阶锥 二阶锥(second-order cone,又称ice-cream/Lorentz cone)的形式为: 非负象限锥 半正定锥 …

【工具变量】上市公司企业广告支出数据(2007-2023年)

一、测算方式:具体而言,参照 Lu 等(2022)的研究,本文通过上市公司财务报表附注获取每家上市公司每年销售费用明细项目,筛选出广告费、广告宣传费、广告推广费、广告策划费、广告展览费等与广告支出相关的项…

【Git】基本操作+分支管理

Git基本操作 Git仓库创建 Git仓库的基本认知 Git仓库就是一个用来跟踪和管理项目文件变化的地方,其记录了所有的修改历史,可以回退到之前的任何一个历史版本 工作区:正在进行实际操作的文件夹暂存区:临时保存想要提交修改的区域…

美国处方利用数据库查询方法

众所周知,药物的处方利用数据一直是评估药品市场渗透率、患者用药习惯以及药品普及程度的重要依据,也是监管机构评估医疗补助计划效率和效果的重要指标,而对于医药企业而言,了解药物的处方利用情况,可以助力他们更好对…

tensorflow入门案例手写数字识别人工智能界的helloworld项目落地1

参考 https://tensorflow.google.cn/?hlzh-cn https://tensorflow.google.cn/tutorials/keras/classification?hlzh-cn 项目资源 https://download.csdn.net/download/AnalogElectronic/89872174 文章目录 一、案例学习1、导入测试和训练数据集,定义模型&#xff…

树莓派应用--AI项目实战篇来啦-13.OpenCV摄像头云台人脸追踪

1. OpenCV 舵机云台人脸追踪介绍 本项目内容和前面学习的云台追踪物体是一样的原理,只是这里把追踪物体修改成追踪人脸,在前面的内容中,我们已经学习了二维云台的物体追踪,理解了二维云台对物体追踪的PID控制模型,在本…

vue+leaflet示例:克里金插值渲染显示(附源码下载)

demo源码运行环境以及配置 运行环境:依赖Node安装环境,demo本地Node版本:14.19.1。运行工具:vscode或者其他工具。配置方式:下载demo源码,vscode打开,然后顺序执行以下命令: (1)下载demo环境依赖…

车易泊车位管理相机 —— 智能管理,停车无忧

在现代城市生活中,停车问题一直是困扰着车主和城市管理者的难题。车位难找、停车管理混乱等问题不仅浪费了人们的时间和精力,也影响了城市的交通秩序和形象。而车易泊车位管理相机的出现,为解决这些问题提供了一种高效、智能的解决方案。 一、…

120多套各种类别微信小程序模板源码

微信小程序是一种轻量级的应用开发平台,由腾讯公司推出,主要应用于移动端,为用户提供便捷的服务体验。本资源包含120套微信小程序的源码,对于开发者来说是一份宝贵的参考资料,可以用来学习、研究或者作为开发新项目的起…

Redux与Redux-thunk详解

Redux与Redux-Thunk中间件的工作原理是Redux状态管理库中的核心概念,它们共同协作以实现复杂应用中的状态管理和异步操作。以下是它们的工作原理的详细解释: Redux的工作原理 Action: Action是Redux中的基本单位,它是一个描述要…

类和对象的认识

类:类是用来描述一个对象的,在java中万物皆对象,通过对类的抽象,类有哪些属性和行为,将这些抽象出来就是类。比如:狗,有名字,年龄,要吃饭的行为等等,将这些动…

iframe的使用详解

目录 一、基本概念和语法 二、优点 1.内容整合与复用: 2.独立的浏览环境: 3.跨域数据展示: 三、缺点 1.可访问性问题: 2.性能问题: 3.安全风险: 四、替代方案 1.使用JavaScript框架进行组件化开…

5G AMR市场调研:前五大厂商占比大约有58.7%的市场份额

5G AMR是指利用5G网络技术来增强移动机器人的通信和控制能力。它结合了高速低延迟的5G通信特性,支持实时数据传输和远程操作,以提升移动机器人在工业自动化和服务领域的应用效率和灵活性。通过5G AMR,机器人可以更快速地响应指令、处理数据&a…

115.WEB渗透测试-信息收集-ARL(6)

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于: 易锦网校会员专享课 上一个内容:114.WEB渗透测试-信息收集-ARL(5) httpd就是apache环境&#xff0…

【AWS AMI跨境备份】跨境使用 S3 备份和还原 AMI 镜像

文章目录 一、实验场景二、实验目标三、实验架构图四、涉及到AWS服务五、演示操作5.1 创建EC2实例5.2 创建映像5.3 备份AMI至Global S35.4 复制AMI从Global S3至 CN S35.5 还原AMI5.6 测试AMI 六、参考链接 一、实验场景 将 AWS Global区域的EC2实例备份至 AWS CN区域。 备份…

vue2使用pdfjs-dist实现pdf预览(iframe形式,不修改pdfjs原来的ui和控件)

前情提要 在一开始要使用pdf预览的时候,第一次选的是vue-pdf,但是vue-pdf支持的功能太少,缺少了项目中需要的一项-复制粘贴功能 之后我一顿搜搜搜,最终貌似只有pdfjs能用 但是网上支持text-layer的貌似都是用的2.09那个版本。 使…

C# 实现调用函数,打印日志(通过反射代理、非IOC)

🎈个人主页:靓仔很忙i 💻B 站主页:👉B站👈 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:C# 🤝希望本文对您有所裨益,如有不足之处&#xff…

常用代码整理

字符串操作相关函数的实现 gets puts strlen strcat strncat strcpy strncpy strcmp strncmp memcpy 内存大小端判断 类型强制转换 联合 排序 选择排序 冒泡排序 插入排序 快速排序 先选一个基准值,通过双指针扫描并交换元素将数组划分为两部分,左…

Go程序的一生——Go如何跑起来的?

引入编译链接概述 编译过程 词法分析语法分析语义分析中间代码生成目标代码生成与优化链接过程Go 程序启动GoRoot 和 GoPathGo 命令详解 go buildgo installgo run总结参考资料 引入 我们从一个 Hello World 的例子开始: package mainimport "fmt"func…

Spring Boot框架下JavaWeb在线考试系统的创新实现

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…