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-079b02290f7busername=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);

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

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

相关文章

VBA字典与数组第十六讲:行、列数不相同的数组间运算规律

《VBA数组与字典方案》教程(10144533)是我推出的第三套教程,目前已经是第二版修订了。这套教程定位于中级,字典是VBA的精华,我要求学员必学。7.1.3.9教程和手册掌握后,可以解决大多数工作中遇到的实际问题。…

【SpringCloud】Config源码解析

config是一个微服务配置组件,为微服务提供集中化的配置管理服务。config包含服务端和客户端,客户端在启动服务时从服务端拉取配置信息,服务端响应客户端的请求提供具体的配置。本章分析config组件配置信息的拉取过程 1、config服务端 服务端…

一键AI抠图太方便啦!不会ps也能成为修图大师

引言 在数字生活中,抠图技能已成为一项日常且必不可少的技能。无论是需要更换证件照的背景色,还是想要将图像中的主体精确分离。 但并非所有人都精通Photoshop,而且对于简单的任务来说,使用Photoshop可能显得过于复杂。因此&…

1077 韩信点兵

这是一个中国剩余定理的问题。中国剩余定理是数论中的一个定理,它给出了一组同余方程的解的存在性和唯一性。在这个问题中,我们需要找到一个数,使得它对给定的每个质数取余的结果等于给定的余数。 以下是一个使用C实现的解决方案&#xff1a…

Spark2.0

目录 10.3 Spark运行架构 10.3.1 基本概念 10.3.2 架构设计 ​编辑 10.3.3 Spark运行基本流程 Spark运行架构特点 10.3 Spark运行架构 10.3.1 基本概念 RDD :是 Resillient Distributed Dataset (弹性分布式数据集)的简称,是分…

【Llama 2的使用方法】

Llama 2是Meta AI(Facebook的母公司Meta的AI部门)开发并开源的大型语言模型系列之一。Llama 2是在其前身Llama模型的基础上进行改进和扩展的,旨在提供更强大的自然语言处理能力和更广泛的应用场景。 以下是Llama 2的一些关键特性和更新点&am…

git主机仓库地址迁移后 git提交代码报错

找到本地电脑的文件known_hosts 2.在代码中git pull 此时终端会有提示 输入ye enter提交便成功了

springboot个人证书管理系统-计算机毕业设计源码16679

摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了个人证书管理系统的开发全过程。通过分析个人证书管理系统管理的不足,创建了一个计算机管理个人证书管理系统的方案。文章介绍了个人证书管理系统的系…

豪掷5400亿,SK海力士加码部署AI赛道

KlipC报道:最新数据显示,韩国6月半导体出口额达到134亿美元(约合人民币973亿元),同比增长50.9%。 KlipC分析师表示,这一数据超出市场预期,对于全球半导体产业链来说,是一则利好的消…

2024年【四川省安全员A证】试题及解析及四川省安全员A证模拟考试

题库来源:安全生产模拟考试一点通公众号小程序 四川省安全员A证试题及解析根据新四川省安全员A证考试大纲要求,安全生产模拟考试一点通将四川省安全员A证模拟考试试题进行汇编,组成一套四川省安全员A证全真模拟考试试题,学员可通…

前后端数据交互流程

一、前言 用户在浏览器访问一个网站时,会有前后端数据交互的过程,前后端数据交互也有几种的情况,一下就简单的来说明一下 二、原理 介绍前后端交互前先来了解一下浏览器的功能,浏览器通过渲染引擎和 JavaScript 引擎协同工作&am…

简明万年历编制(C语言)

简明万年历编制(C语言 ) 编制万年历的要素: 农历公历对照,显示星期,农历干支年,当年生肖,国定节假日,寒天九九,暑日三伏,入梅出梅,节气时间&#…

剑神诀_单机架设_无需虚拟机_小白专用

前言 今天给大家带来一款单机游戏的架设:剑神诀,一键端 无需虚拟机 如今市面上的资源参差不齐,大部分的都不能运行,本人亲自测试,运行视频如下: 剑神诀 搭建教程 此游戏架设不需要安装虚拟机,…

单模光纤(SMF)市场规模不断增长 非色散位移单模光纤为其代表产品

单模光纤(SMF)市场规模不断增长 非色散位移单模光纤为其代表产品 单模光纤(SMF)指芯径为8-10微米,用于单一传输模式的光纤。单模光纤具有频带宽、芯径细、适合长距离传输、传输耗损低、抗干扰能力强、传输速度快等优势…

MySQL实训项目——餐饮点餐系统

项目简介:餐饮点餐系统是一款为餐厅和顾客提供便捷点餐服务的在线平台。通过该系统,餐厅能够展示其菜单,顾客可以浏览菜品,并将其加入购物车或直接下单。系统还提供了订单管理功能,方便餐厅跟踪和处理顾客的订单。 1. …

【计算机网络】传输层(作业)

1、OSI参考模型中,提供端到端的透明数据传输服务、差错控制和流量控制的层是(C)。 A. 物理层B. 网络层C. 运输层D. 会话层 2、运输层为(B)之间提供逻辑通信。 A. 主机B. 进程C. 路由器D. 操作系统 3、运输层面向连接…

RT-Thread Studio与CubeMX联合编程之rtthread stm32h743的使用(十一)spi设备SFUD驱动的使用

我们要在rtthread studio 开发环境中建立stm32h743xih6芯片的工程。我们使用一块stm32h743及fpga的核心板完成相关实验,核心板如图: 1.建立新工程,选择相应的芯片型号及debug引脚及调试器 2.编译下载,可以看到串口打印正常 3.…

Hubstudio指纹浏览器:海外代理IP新选择,IPXProxy为何备受推崇?

许多人都会把Hubstudio指纹浏览器和代理IP进行搭配使用,为了保证网络操作的顺利进行,例如亚马逊的多账号管理。那有没有好用的海外代理IP呢,如何在Hubstudio指纹浏览器中使用代理IP呢? 下面就给大家推荐好用的一家海外IP代理&…

积鼎CFD:基于Virtualflow在溃坝洪水演进数值仿真分析

近期,多地遭受了前所未有的洪水侵袭,每一次灾害都如同警钟长鸣,提醒我们水库大坝安全的重要性,超标准暴雨的突袭让大坝的安全防线面临前所未有的考验。面对这一挑战,CFD技术可为溃坝洪水的预测与管理开辟新的路径。凭借…