SpringSecurity中文文档(Servlet Persisting Authentication)

Persisting Authentication

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

Example 1. Unauthenticated User Requests Protected Resource

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

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

Username and Password Submitted

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 相关联,以防止会话固定攻击。

Authenticated User is Associated to New Session

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

后续请求包括会话 Cookie,该 Cookie 用于在会话的其余部分对用户进行身份验证。

Authenticated Session Provided as Credentials

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

SecurityContextRepository

在 SpringSecurity 中,用户与未来请求的关联是使用 SecurityContextRepository 实现的。

SecurityContextRepository 的默认实现是 RegiatingSecurityContextRepository,它将委托给以下内容:

  • HttpSessionSecurityContextRepository
  • RequestAttributeSecurityContextRepository

HttpSessionSecurityContextRepository

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

NullSecurityContextRepository

如果不希望将 SecurityContext 关联到一个 HttpSession (即在使用 OAuth 进行身份验证时) ,则 NullSecurityContextRepository 是 SecurityContextRepository 的一个实现,它不执行任何操作。

RequestAttributeSecurityContextRepository

RequestAttributeSecurityContextRepository 将 SecurityContext 保存为一个请求属性,以确保对于可能清除 SecurityContext 的分派类型发生的单个请求,SecurityContext 是可用的。

例如,假设客户端发出请求,经过身份验证,然后出现错误。根据 servlet 容器实现,错误意味着清除建立的任何 SecurityContext,然后进行错误分派。当进行错误分派时,不会建立 SecurityContext。这意味着除非以某种方式持久化 SecurityContext,否则错误页面不能使用 SecurityContext 进行授权或显示当前用户。

Use RequestAttributeSecurityContextRepository

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

DelegatingSecurityContextRepository

RegiatingSecurityContextRepository 将 SecurityContext 保存到多个 SecurityContextRepository 委托,并允许以指定的顺序从任何委托中检索。

对此最有用的安排是使用以下示例配置的,该示例允许同时使用 RequestAttributeSecurityContextRepository 和 HttpSessionSecurityContextRepository。

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

在 Spring Security6中,上面显示的示例是默认配置。

SecurityContextPersistenceFilter

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

securitycontextpersistencefilter

  • 在运行应用程序的其余部分之前,SecurityContextPersisenceFilter 从 SecurityContextRepository 加载 SecurityContext 并将其设置为 SecurityContextHolder。
  • 接下来,运行应用程序。
  • 最后,如果 SecurityContext 已经更改,我们将使用 SecurityContextPersisenceRepository 保存 SecurityContext。这意味着在使用 SecurityContextPersisenceFilter 时,只需设置 SecurityContextHolder 即可确保使用 SecurityContextRepository 保持 SecurityContext。

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

为了避免这些问题,SecurityContextPersisenceFilter 同时包装了 HttpServletRequest 和 HttpServletResponse,以检测 SecurityContext 是否已经更改,如果已经更改,则在响应提交之前保存 SecurityContext。

SecurityContextHolderFilter

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

securitycontextholderfilter

  1. 在运行应用程序的其余部分之前,SecurityContextHolderFilter 从 SecurityContextRepository 加载 SecurityContext 并将其设置为 SecurityContextHolder。
  2. 接下来,运行应用程序。

与 SecurityContextPersisenceFilter 不同,SecurityContextHolderFilter 只加载SecurityContext,它不保存 SecurityContext。

Explicit Saving of SecurityContext

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

在使用配置时,重要的是,任何用 SecurityContext 设置 SecurityContextHolder 的代码都应该将 SecurityContext 保存到 SecurityContextRepository,如果它应该在请求之间保存的话。

例如,以下代码:

使用 SecurityContextPersisenceFilter 设置 SecurityContextHolder

SecurityContextHolder.setContext(securityContext);

应该用

使用 SecurityContextHolderFilter 设置 SecurityContextHolder

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

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

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

相关文章

机器人控制系列教程之Simulink中模型搭建(1)

机器人模型获取 接上期:机器人控制系列教程之控制理论概述,文中详细讲解了如何通过Solidworks软件导出URDF格式的文件。文末提到了若需要将其导入到Simulink中可在命令行中输入smimport(urdf/S_Robot_urdf.urdf),MATLAB将自动打开Simulink以…

【揭秘】国内十大顶尖AI大模型,引领智能科技新纪元

大模型大模型通常指的是参数量非常大、数据量也非常大的深度学习模型。这些模型由数百万到数十亿甚至更多的参数组成,需要海量的数据和强大的计算资源进行训练和推理学习的模型。大模型设计的目的在于提高模型的表示能力和性能、应对复杂数据集和任务、提升泛化能力…

65.WEB渗透测试-信息收集- WAF、框架组件识别(5)

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于: 易锦网校会员专享课 上一个内容:64.WEB渗透测试-信息收集- WAF、框架组件识别(4)-CSDN博客 waf绕…

c语言的烫烫烫烫烫??

当初学习C语言时,对于一些特殊的打印输出可能会感到困惑,比如会出现一堆乱码烫烫烫的情况。其实这是因为在C语言中,对于字符类型和数字类型之间的隐式转换可能会导致打印输出的结果不符合预期。这并不意味着程序员"烫",…

详解归一化、标准化、正则化以及batch normalization

文章目录 what(是什么)where(用在哪)How(如何用&&原理)归一化实现方式原理示例说明 标准化实现方式原理示例说明 正则化实现方式原理作用 Batch Normalizationpytorch中的batch normalization原理BN的作用 归一化、标准化…

EXCEL怎么一模一样复制粘贴?

第一步 鼠标选中复制子表 右击建立副本 第二步 建立好副本表格 第三步 将选定工作表移动至新表格 第四步 成功完成移动

社区的用户分层运营如何做?

在社区运营中用户分层尤为关键,20%的高粘性用户带动80%的普通用户。我们主要围绕的是这20%的粘性用户,因为他们才是决定我们未来能不能最好做大最重要的人 分层运营策略 1️⃣对普通用户: 📚满意:搜索是内容多而全&…

数据结构 -AVL树

文章目录 AVL树左旋和右旋插入的四种情况(一)新数字插到了左子树,导致左子树比右子树高2;左孩子的左子树比其右子树高1(二)新数字插到了左子树,导致左子树比右子树高2;左孩子的右子树…

linux的Top学习

学习文档 https://www.cnblogs.com/liulianzhen99/articles/17638178.html TOP 问题 1:top 输出的利用率信息是如何计算出来的,它精确吗? top 命令访问 /proc/stat 获取各项 cpu 利用率使用值内核调用 stat_open 函数来处理对 /proc/sta…

蓝桥杯算法双周赛

四、赛后真题解析 比赛赛后将提供免费直播讲解,主讲人:待定。时间:07 月 13 日(比赛当日)晚 21 时。观看直播地址:第3场蓝桥算法季度赛赛后题解直播 - 蓝桥云课 - 哔哩哔哩直播,二次元弹幕直播…

ShareSDK HarmonyOS NEXT集成指南

集成前准备 注册账号 使用MobSDK之前,需要先在MobTech官网注册开发者账号,并获取MobTech提供的AppKey和AppSecret,详情可以点击查看注册流程 ShareSDK流程图 集成配置 添加依赖 在Terminal窗口中,执行如下命令进行安装 ohpm …

彻底搞懂Webpack插件

前言 首先我们先回忆一下Webpack插件是如何使用的?下面是一份基础的Webpack配置文件: let htmlWebpackPlugin require(html-webpack-plugin);module.exports {mode: development,entry: {main: path.join(__dirname, src/index.js)},output: {path: …

认识软件测试

认识软件测试 软件测试能力要求一、软件测试的步骤1.需求2.测试点3.测试用例4.执行测试用例5.缺陷管理6.测试报告 一、测试用例(test case)**用例编写要素**: 测试用例设计方法1.等价类2.边界值3.判定表法4.场景法 软件测试能力要求 软件测试…

张颂文百花提名,男配界笑出“颂”彩

在这个星光熠熠的百花奖舞台上, 张颂文老师犹如一坛陈年老酒,越品越有味, 竟不声不响地提名了最佳男配角!这下可好, 男配界仿佛一夜之间被“颂”风吹得花枝乱颤,笑料百出。你说张颂文老师这演技&#xf…

嵌套组合请求对象的校验与全局捕捉

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119qq.com] &#x1f4f1…

怎么压缩图片大小?6种无需牺牲质量的图片压缩方法

经常处理图片的小伙伴都知道,高质量的图片往往会占据电脑大量的存储空间,导致图片传输及存储的不便。因此,掌握如何压缩图片大小变得尤为重要。本文将详细介绍图片压缩的几种方法,帮助你高效地减小图片文件大小,让你的…

【ACM出版,马来西亚-吉隆坡举行】第四届互联网技术与教育信息化国际会议 (ITEI 2024)

作为全球科技创新大趋势的引领者,中国不断营造更加开放的科技创新环境,不断提升学术合作的深度和广度,构建惠及各方的创新共同体。这是对全球化的新贡献,是构建人类命运共同体的新贡献。 第四届互联网技术与教育信息化国际学术会议…

秒懂设计模式--学习笔记(5)【创建篇-抽象工厂】

目录 4、抽象工厂4.1 介绍4.2 品牌与系列(针对工厂泛滥)(**分类**)4.3 产品规划(**数据模型**)4.4 生产线规划(**工厂类**)4.5 分而治之4.6 抽象工厂模式的各角色定义如下4.7 基于此抽象工厂模式以品牌与系…

本地文本向量模型的部署提供兼容openai的接口

前言 之前部署了fastgpt官方文档的一个,提供的一个m3e-large的向量模型打包的docker镜像,虽然使用起来整体效果还可以,但是有些文本向量相似度匹配的结果还是不太满意的,目前,网络上层出不穷的带推理文本向量,想体验一下,于是我基于modelscope库封装了一个兼容open ai的…

有哪些Python书籍是程序员强烈推荐?

有一本升级版的经典Python项目编程书一定要推荐一下。 Python极客项目编程(第2版) 第一版累计销售19万册,豆瓣评分8.4。每个项目都按照【讲解原理-分析需求-代码精讲-知识小结-扩展练习-完整代码】的方式进行讲解,并提供可下载运…