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-079b02290f7b

username=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

注意:在Spring Security 6中,SecurityContextPersistenceFilter已被弃用,取而代之的是SecurityContextHolderFilter。

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.mfbz.cn/a/379962.html

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

相关文章

前端实现支付跳转以及回跳

// 支付地址 const baseURL http://pcapi-xiaotuxian-front-devtest.itheima.net/ const backURL http://127.0.0.1:5173/paycallback const redirectUrl encodeURIComponent(backURL) const payUrl ${baseURL}pay/aliPay?orderId${route.query.id}&redirect${redirec…

PyTorch 2.2 中文官方教程(一)

PyTorch 秘籍 PyTorch 秘籍 原文:pytorch.org/tutorials/recipes/recipes_index.html 译者:飞龙 协议:CC BY-NC-SA 4.0 秘籍是关于如何使用特定 PyTorch 功能的简短、可操作的示例,与我们的全长教程不同。 PyTorch 原型示例 原文…

Linux嵌入式开发+驱动开发-中断

swi汇编指令可以产生软中断,以下是硬件中断的产生到执行完毕的全过程: 在自己设计的芯片“CPU响应中断”程序的第四个步骤可以转向“中断向量控制器”,中断向量控制器中存储中断元服务地址即处理中断处理程序的地址,而不用使用0X1…

ONLYOFFICE文档8.0新功能浅探

ONLYOFFICE文档8.0新功能浅探 上个月末这个月初的几天,ONLYOFFICE版本更新了!更新到了一个比较整的大的版本号,8.0版本,看来这个生产力工具的升级速度基本上能保持每年两个版本号的速度,还是很快的,一般来…

Java强训day15(选择题编程题)

选择题 自连接使用一张表编程题 题目1 import java.util.Scanner;public class Main { public static int res(int n) {StringBuffer s new StringBuffer();while(n!0) {s.append(n%2);n/2;}int sum 0;String ss s.reverse().toString();for(int i0;i<ss.length()…

秋招上岸大厂,分享一下经验

文章目录 秋招过程学习过程项目经验简历经验面试经验offer选择总结 秋招过程 今天是除夕&#xff0c;秋招已经正式结束了&#xff0c;等春节过完就到了春招的时间点了。 运气比较好&#xff0c;能在秋招的末尾进入一家大厂&#xff0c;拿到20k的sp offer。 从九月份十月份就开…

TCP 传输控制协议——详细

目录 1 TCP 1.1 TCP 最主要的特点 1.2 TCP 的连接 TCP 连接&#xff0c;IP 地址&#xff0c;套接字 1.3 可靠传输的工作原理 1.3.1 停止等待协议 &#xff08;1&#xff09;无差错情况 &#xff08;2&#xff09;出现差错 &#xff08;3&#xff09;确认丢失和确认迟到…

【RT-DETR改进涨点】更加聚焦的边界框损失Focaler-IoU、InnerFocalerIoU(二次创新)

一、本文介绍 本文给大家带来的改进机制是更加聚焦的边界框损失Focaler-IoU已经我进行二次创新的InnerFocalerIoU同时本文的内容支持现阶段的百分之九十以上的IoU,比如Focaler-IoU、Focaler-ShapeIoU、Inner-Focaler-ShapeIoU包含非常全的损失函数,边界框的损失函数只看这一…

RCE(命令执行)知识点总结最详细

description: 这里是CTF做题时常见的会遇见的RCE的漏洞知识点总结。 如果你觉得写得好并且想看更多web知识的话可以去gitbook.22kaka.fun去看&#xff0c;上面是我写的一本关于web学习的一个gitbook&#xff0c;当然如果你能去我的github为我的这个项目点亮星星我会感激不尽htt…

C#用Array类的Reverse方法反转数组中元素

目录 一、Array.Reverse 方法 1.重载 2.Reverse(Array, Int32, Int32) 3. Reverse(Array) 4.Reverse(T[]) 5. Reverse(T[], Int32, Int32) 二、实例 1.Array.Reverse 方法4种重载方法综合实例 2.Reverse(Array)方法的实例 一、Array.Reverse 方法 反转一维 Array 或部…

Android修改系统默认字体

文章目录 前言一、方案1、将定制的custom_fonts.xml配置文件编译到系统中2、将自定义的字体ttf文件编译到系统中3、在系统的编译mk中添加fonts.mk的引用4、修改系统代码,使得优先加载使用custom_fonts.xml前言 Android系统中的字体配置文件为/system/etc/fonts.xml 关于fonts…

JVM之GC垃圾回收

GC垃圾回收 如何判断对象可以回收 引用计数法 如果有对象引用计数加一&#xff0c;没有对象引用&#xff0c;计数减一&#xff0c;如果计数为零&#xff0c;则回收 但是如果存在循环引用&#xff0c;即A对象引用B对象&#xff0c;B对象引用A对象&#xff0c;会造成内存泄漏 可…

linux之wsl2安装远程桌面

0. 安装后的效果 1. wsl中打开terminal并安装库 sudo apt-get purge xrdp sudo apt install -y xrdp sudo apt install -y xfce4 sudo apt install -y xfce4-goodies 2.优化显示 sudo sed -i s/max_bpp32/#max_bpp32\nmax_bpp128/g /etc/xrdp/xrdp.ini sudo sed -i s/xserverbp…

听说有 Hugging Face 陪伴的春节,是这样的…

辞旧迎新春节到&#xff0c;家家户户好热闹。Hugging Face 中国团队成员祝各位社区成员们新春快乐&#xff0c;万事如意&#xff01; 过去的一年我们持续看到 AI 技术的腾飞和发展&#xff0c;以及诸多机构为开源 AI 作出巨大的贡献。非常感谢将模型、数据集和应用 Demo 发布在…

寒假作业:2024/2/8

作业1&#xff1a;现有文件test.c\test1.c\main.c,编写Makkefile Makefile代码&#xff1a; CCgcc EXEa.out OBJS$(patsubst %.c,%.o,$(wildcard *.c)) CFLAGS-c -oall:$(EXE)$(EXE):$(OBJS)$(CC) $^ -o $%.o:%.c$(CC) $(CFLAGS) $ $^.PHONY:cleanclean:rm $(OBJS) $(EXE)效果…

网络安全产品之认识准入控制系统

文章目录 一、什么是准入控制系统二、准入控制系统的主要功能1. 接入设备的身份认证2. 接入设备的安全性检查 三、准入控制系统的工作原理四、准入控制系统的特点五、准入控制系统的部署方式1. 网关模式2. 控制旁路模式 六、准入控制系统的应用场景七、企业如何利用准入控制系统…

CTF--Web安全--SQL注入之Post-Union注入

一、手动POST注入实现绕过 账号密码检测 我们利用sqli-labs/Less-11靶场来进行演示&#xff1a; 我们可以看到一个登录页面 打开Less-11的根目录&#xff0c;我们打开页面的源代码(PHP实现)。 用VS-code打开文件&#xff0c;找到验证登录信息的代码行。 此形式的代码存在POST…

【Linux】Linux开发工具(yum、gdb、git)详解

一、软件包管理器 yum 1、什么是软件包 在 Linux 下安装软件&#xff0c;通常的办法是下载到程序的源代码&#xff0c;并进行编译&#xff0c;得到可执行程序。但这样太麻烦了&#xff0c;于是有些人把一些常用的软件提前编译好&#xff0c;做成软件包&#xff08;可以理解成…

奋斗与诗意的三纲八目

人生得有一个基调、总的宗旨、指导思想、根据、根本。当人做出一个重大决定时&#xff0c;绝非偶然&#xff0c;一定是背后的宗旨在起作用。你每天起床的动力&#xff0c;是否能热情洋溢地做事&#xff0c;也是这个宗旨在起作用。念天地之悠悠独怆然而涕下&#xff0c;忧思难忘…

【数据结构】数据结构

本文是基于中国MOOC平台上&#xff0c;华中科技大学的《数据结构》课程和浙江大学的《数据结构》课程所作的一篇课程笔记&#xff0c;便于后期讲行系统性查阅和复习。 从个人感受而言&#xff0c;华中科技大学的课程讲解更适合初学者&#xff08;缺点在于&#xff0c;从概念到…