spring-security authentication persistence

翻译版本【spring-security 6.2.1】persistence

Persisting Authentication

用户第一次请求受保护的资源时,系统会提示他们输入凭据。提示输入凭据的最常见方法之一是将用户重定向到登录页面。未经身份验证的用户请求受保护的资源的HTTP交换可能如下所示:
例1。未经认证的用户请求受保护的资源:

GET / HTTP/1.1
Host: example.com
Cookie: SESSION=91470ce0-3f3c-455b-b7ad-079b02290f7b

用户提交他们的用户名和密码。
提交用户名和密码

POST /login HTTP/1.1
Host: example.com
Cookie: SESSION=91470ce0-3f3c-455b-b7ad-079b02290f7busername=user&password=password&_csrf=35942e65-a172-4cd4-a1d4-d16a51147b3e

认证完成后,将用户关联到一个新的会话id,防止会话固定攻击。
“认证用户”关联新会话

HTTP/1.1 302 Found
Location: /
Set-Cookie: SESSION=4c66e474-3f5a-43ed-8e48-cc1d8cb1d1c8; Path=/; HttpOnly; SameSite=Lax

后续请求包括会话cookie,用于在会话的剩余时间内对用户进行身份验证。

作为凭据提供的身份验证会话

GET / HTTP/1.1
Host: example.com
Cookie: SESSION=4c66e474-3f5a-43ed-8e48-cc1d8cb1d1c8

SecurityContextRepository

在Spring Security中,用户与未来请求的关联是使用SecurityContextRepository实现的。SecurityContextRepository的默认实现是DelegatingSecurityContextRepository,它委托以下内容:

  • HttpSessionSecurityContextRepository
  • RequestAttributeSecurityContextRepository

HttpSessionSecurityContextRepository

HttpSessionSecurityContextRepository将SecurityContext关联到HttpSession。如果用户希望以另一种方式将用户与后续请求关联起来,或者根本不关联,则可以用SecurityContextRepository的另一个实现替换HttpSessionSecurityContextRepository 。

NullSecurityContextRepository

如果不希望将SecurityContext与HttpSession相关联(即,当使用OAuth进行身份验证时),则NullSecurityContextRepository是SecurityContextRepository的一个实现,它什么也不做。

RequestAttributeSecurityContextRepository

RequestAttributeSecurityContextRepository将SecurityContext保存为请求属性,对于跨调度类型的单个请求可能清除SecurityContext的发生,来确保SecurityContext可用。
例如,假设客户端发出请求并通过身份验证,然后发生错误。根据servlet容器实现的不同,该错误意味着已建立的任何SecurityContext都将被清除,然后进行错误调度。当进行错误调度时,没有建立SecurityContext。这意味着错误页面不能使用SecurityContext进行授权或显示当前用户,除非SecurityContext以某种方式被持久化。

使用RequestAttributeSecurityContextRepository

public SecurityFilterChain filterChain(HttpSecurity http) {http// ....securityContext((securityContext) -> securityContext.securityContextRepository(new RequestAttributeSecurityContextRepository()));return http.build();
}

DelegatingSecurityContextRepository

DelegatingSecurityContextRepository将SecurityContext保存到多个SecurityContextRepositorys委托,并允许按指定顺序从任何委托中检索。

下面的例子配置了最有用的安排,它允许同时使用RequestAttributeSecurityContextRepository和HttpSessionSecurityContextRepository。

配置DelegatingSecurityContextRepository

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {http// ....securityContext((securityContext) -> securityContext.securityContextRepository(new DelegatingSecurityContextRepository(new RequestAttributeSecurityContextRepository(),new HttpSessionSecurityContextRepository())));return http.build();
}

注意
在SpringSecurity6中,上面显示的示例是默认配置。

SecurityContextPersistenceFilter

SecurityContextPersistenceFilter负责使用SecurityContextRepository在请求之间持久化SecurityContext。

在这里插入图片描述
在这里插入图片描述
在运行应用程序的其余部分之前,SecurityContextPersistenceFilter从SecurityContextRepository加载SecurityContext,并将其设置在SecurityContextHolder上。
在这里插入图片描述
接下来,运行应用程序。
在这里插入图片描述
最后,如果SecurityContext已经更改,我们将使用SecurityContextPersistenceRepository保存SecurityContext。这意味着,当使用SecurityContextPersistenceFilter时,只需设置SecurityContextHolder就可以确保使用SecurityContextRepository持久化SecurityContext。

在某些情况下,响应在SecurityContextPersistenceFilter方法完成之前被提交并写入到客户端。例如,如果将重定向发送到客户端,则立即将响应写回客户端。这意味着在步骤3中不可能建立HttpSession,因为会话id不能包含在已经写好的响应中。另一种可能发生的情况是,如果客户端身份验证成功,则在SecurityContextPersistenceFilter完成之前提交响应,并且客户端在SecurityContextPersistenceFilter完成之前发出第二个请求,第二个请求中可能存在错误的身份验证。

为了避免这些问题,SecurityContextPersistenceFilter包装HttpServlet请求和HttpServlet响应,以检测SecurityContext是否已更改,如果已更改,则在提交响应之前保存SecurityContext。

SecurityContextHolderFilter

SecurityContextHolderFilter负责使用SecurityContextRepository在请求之间加载SecurityContext。

在这里插入图片描述

在这里插入图片描述
在运行应用程序的其余部分之前,SecurityContextHolderFilter从securitycontexrepository加载SecurityContext,并将其设置在SecurityContextHolder上。

在这里插入图片描述
接下来,运行应用程序。

与SecurityContextPersistenceFilter不同,SecurityContextHolderFilter只加载SecurityContext,而不保存SecurityContext。这意味着在使用SecurityContextHolderFilter时,需要显式保存SecurityContext。

SecurityContext的显式保存

public SecurityFilterChain filterChain(HttpSecurity http) {http// ....securityContext((securityContext) -> securityContext.requireExplicitSave(true));return http.build();
}

在使用配置时,如果需要在请求之间持久化SecurityContext,那么使用SecurityContext设置SecurityContextHolder的任何代码也要将SecurityContext保存到SecurityContextRepository中,这一点很重要。

例如,以下代码:
使用SecurityContextPersistenceFilter设置SecurityContextHolder

SecurityContextHolder.setContext(securityContext);

应该替换为
使用SecurityContextHolderFilter设置SecurityContextHolder

SecurityContextHolder.setContext(securityContext);
securityContextRepository.saveContext(securityContext, httpServletRequest, httpServletResponse);

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

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

相关文章

关于Linux和消息队列常见的十道面试题

实际工作中如何排查CPU飙升问题? 在实际工作中,我们可以通过以下步骤来排查CPU飙升的问题: 使用系统监控工具:首先,我们可以使用系统监控工具,如top命令,来查看所有进程占系统CPU的排序。这样可…

UML---用例图,类图

用例图 用例图(Use Case Diagram)主要描述系统的功能需求和参与者与系统之间的交互。它是用户与系统交互的最简表示形式,展现了用户和与他相关的用例之间的关系。用例图被视为系统的蓝图,通过它,人们可以获知系统不同种…

mysql:事务的特性ACID、并发事务(脏读、不可重复读、幻读、如何解决、隔离级别)、undo log和redo log的区别、相关面试题和答案

事务是一组操作的集合,它会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。 事务的特性(ACID) 原子性(Atomicity):事务是不可分割的…

idea开发工具的简单使用与常见问题

1、配置git 选择左上角目录file->setting 打开,Version Control 目录下Git,选择git安装目录下的git.exe文件; 点击test,出现git版本,则表示git识别成功,点击右下角确认即可生效。 2、配置node.js 选…

ubuntu开机报错/dev/nume0n1p2:clean

本来是开机卡在这个界面,经过以下操作,变成这种了 现在的问题变成linux卡在 failed to start NVIDIA Persistence Daemon 按照下面的操作方法,可以有开机界面了。但是输入密码后,一直在登录界面 1.方式一:重新安装显…

TypeScript 学习笔记(Day4)

「写在前面」 本文为 b 站黑马程序员 TypeScript 教程的学习笔记。本着自己学习、分享他人的态度,分享学习笔记,希望能对大家有所帮助。推荐先按顺序阅读往期内容: 1. TypeScript 学习笔记(Day1) 2. TypeScript 学习笔…

【计算机网络】Socket的SO_TIMEOUT与连接超时时间

SO_TIMEOUT选项是Socket的一个选项,用于设置读取数据的超时时间。它指定了在读取数据时等待的最长时间,如果在指定的时间内没有数据可读取,将抛出SocketTimeoutException异常。 SO_TIMEOUT的设置 默认情况下,SO_TIMEOUT选项的值…

SystemVerilog约束随机(二)

文章目录 前言一、SystemVerilog约束随机1.1 集合操作set membership1.2 权重约束weighted constraints1.3 队列约束array constranint1.4 条件约束order constraints1.5 等价约束equivalence constraints1.6 顺序约束solver order 总结 前言 这里主要记录一下systemverilog中…

【Rust】——rust前言与安装rust

🎃个人专栏: 🐬 算法设计与分析:算法设计与分析_IT闫的博客-CSDN博客 🐳Java基础:Java基础_IT闫的博客-CSDN博客 🐋c语言:c语言_IT闫的博客-CSDN博客 🐟MySQL&#xff1a…

ACM训练题:Division

题意是给你N&#xff0c;打印出所有相除等于N的五位数&#xff08;包含前导零&#xff09;&#xff0c;可以枚举后五位&#xff0c;计算量是10&#xff01;/5&#xff01;&#xff0c;然后乘N&#xff0c;一起检验10个数是否都出现。 AC代码&#xff1a; #include <iostre…

蓝桥杯省赛无忧 课件111 带权并查集

01 什么是带权并查集&#xff1f; 02 算法原理 03 经典例题分析

uniapp踩坑之项目:简易版不同角色显示不一样的tabbar和页面

1. pages下创建三个不同用户身份的“我的”页面。 显示第几个tabbar&#xff0c;0是管理员 1是财务 2是司机 2. 在uni_modules文件夹创建底部导航cc-myTabbar文件夹&#xff0c;在cc-myTabbar文件夹创建components文件夹&#xff0c;在components文件夹创建cc-myTabbar.vue组件…

五、MyBatis 高级扩展

本章概要 Mapper 批量映射优化插件和分页插件 PageHelper 插件机制和 PageHelper 插件介绍PageHelper 插件使用 逆向工程和 MybatisX 插件 ORM 思维介绍逆向工程逆向工程插件 MyBatisX 使用 5.1 Mapper 批量映射优化 需求 Mapper 配置文件很多时&#xff0c;在全局配置文件…

Spark Shuffle Service简介与测试

一 Dynamic Resource Allocation(动态资源分配) 了解Shuffle Service之前&#xff0c;我们需要先了解和Shuffle Service有关的另一个特性&#xff1a;动态资源分配。 Spark管理资源有两种方式&#xff1a;静态资源分配和动态资源分配。 静态资源分配&#xff1a;spark提交任…

Java并发基础:Phaser全面解析!

内容概要 Phaser是Java中一个灵活的同步工具&#xff0c;其优点在于支持多阶段的任务拆分与同步&#xff0c;并且能够动态地注册与注销参与者&#xff0c;它提供了丰富的等待与推进机制&#xff0c;使得开发者能够更细粒度地控制线程的协调行为&#xff0c;实现复杂的并行任务…

Redis核心技术与实战【学习笔记】 - 25.Redis 支撑秒杀场景的关键技术

简述 秒杀是一个非常经典的活动场景&#xff0c;比如&#xff0c;在双 11、618 等电商促销活动中&#xff0c;都会有秒杀场景。秒杀场景的业务特点是限时限量&#xff0c;业务系统要处理瞬时的大量高并发请求&#xff0c;而 Redis 就经常被用来支撑秒杀活动。 秒杀场景包含多…

2.4日总结

第一题&#xff1a;选数 题解&#xff1a;思路还是很简单的&#xff0c;只需要想清楚dfs里的函数都是什么就可以了&#xff0c;还有一个简单的判断素数的函数&#xff0c;这题真没啥难度&#xff0c;就是属于基础题吧&#xff0c;请看AC代码 #include <stdio.h> #includ…

【c/python】GtkGrid

一、GtkGrid GtkGrid 是 GTK (GIMP Toolkit) 中的一个基础容器构件&#xff08;widget&#xff09;&#xff0c;它可以用来安排其他构件在一个灵活的多行多列的网格中。每个加入网格的构件都可以占据一个或多个行和列。由于 GtkGrid 提供了在二维空间中安排构件的方式&#xf…

YOLOv5独家改进:上采样算子 | 超轻量高效动态上采样DySample,效果秒杀CAFFE,助力小目标检测

💡💡💡本文独家改进:一种超轻量高效动态上采样DySample, 具有更少的参数、FLOPs,效果秒杀CAFFE和YOLOv5网络中的nn.Upsample 💡💡💡在多个数据集下验证能够涨点,尤其在小目标检测领域涨点显著。 收录 YOLOv5原创自研 https://blog.csdn.net/m0_63774211/cate…