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.hqwc.cn/news/452886.html

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

相关文章

string,map,set高级用法

7-23 Document Distance Exp 计算文件的嵌入向量的夹角,不考算法,是一个程序化题目利用的sstream用于行处理,map和set用于统计相关变量,cmath.acos计算脱离出函数的原因: 1)避免重复2-3遍; 2)模块化更清晰; 两个属性的对象用map就…

Text Mesh Pro图文混排如何对任何图片都能实现

1)Text Mesh Pro图文混排如何对任何图片都能实现 2)Unity iOS平台的小图占用特别大的内存 3)只在编辑器内,纹理不开启Read&Write情况下,如何获取纹理所有颜色值 4)准备在海外发行游戏,有哪些…

计组学习笔记2024/2/4

1.计算机的发展历程 2.计算机硬件的基本组成 存储器 -> 就是内存. 3.各个硬件的部件 寄存器 -> 用来存放二进制数据. 各个硬件的工作原理视频留白,听完后边课程之后再来理解理解. 冯诺依曼计算机的特点: 1.计算机由五大部件组成 2.指令和数据以同等地位存于存储器,…

对象内存与方法调用机制

对象的内存布局 对象、字符串和数组都是引用类型,指向的数 我们以下面main方法部分代码片段为例: Cat cat new Cat(); cat.name "小白"; cat.age 12; cat.color "白色"; 首先执行mian方法,会在栈里创建一个独立的m…

QT6调用音频输入输出(超详细)

目录 一、QT6音频调用与QT5的区别 1.QAudioSource代替QAudioInput类 2.QAudioSink代替QAudioOutput类 二、音频操作中Push和Pull的区别 三、依托于Websocket实现实时对讲机 1.AudioIputDevices类 2.AudioOutputDevices类 3.实现的AudioHandler类完整内容 本人实际是要完…

Open CASCADE学习|分割曲线

1、通过参数进行分割 分别获得曲线的 FirstParameter 和 LastParameter ,然后对参数进行分割,获得n个ui,并对每个ui调用D0(获得这个点的坐标值)或D1(获得这个点的坐标值和切向量)。这个方法的优…

海康IPC摄像机接入国标平台,发现一直不在线(离线)的处理方式

目 录 一、问题 二、问题分析 (一)常见设备离线问题的原因 (二)原因分析 三、问题查处 (一)设备端排查故障(设备端自查) 1、检查GB28181参数配置是否有误 2、…

【LeetCode: 292. Nim 游戏+ 博弈问题】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

算法——递归与搜索算法

1. 递归 ①什么是递归? 官方一点来说 递归指的是一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法。 通俗一点来说,递归就是一个函数自己调用自己的过程 ②什么情况下会用到递归? 我们在遇见一个问题的时候,我怎…

ffmpeg操作实战001:视频+音频文件融合

一、功能需求 把视频文件video.mp4 和音频文件audio.wav融合在一起,输出视频文件output.mp4 二、操作指令 ffmpeg -i video.mp4 -i audio.wav -c:v copy -map 0:v:0 -map 1:a:0 output.mp4 三、参数说明 ffmpeg: 这是用于执行FFmpeg命令行工具的命令。-i video…

深度学习(生成式模型)—— Consistency Models

文章目录 前言预备知识:SDE与ODEMethod实验结果 前言 Diffusion model需要多次推断才能生成最终的图像,这将耗费大量的计算资源。前几篇博客我们已经介绍了加速Diffusion model生成图像速率的DDIM和Stable Diffusion,本节将介绍最近大火的Co…

HarmonyOS 鸿蒙应用开发(九、还是蓝海,如何贡献第三方库)

快来共享第三方库吧,不但可以通过分享自己的成果,可以获得来自全球开发者的技术反馈和建议,提升自身技术能力,还有助于提高个人或团队在开源社区中的知名度和影响力。在流量时代和粉丝经济时代,获得曝光度和流量密码。…