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 (弹性分布式数据集)的简称,是分…

elasticsearch入门基本知识+使用案例

1、ES逻辑结构 索引-index:相当于db中的数据库名。索引命名规则:小写字母。 类型-type:相当于数据库中的表名,为具有相同字段的文档定义的一个类型。 字段-field:相当于表字段名,文档数据的属性…

C 标准库 - <stdio.h>

C 标准库 - <stdio.h> 概述 <stdio.h> 是 C 语言标准库中的一个头文件&#xff0c;它包含了用于输入输出操作的函数声明。这些函数主要用于处理文件读写、格式化输出、字符输入输出等操作。stdio.h 是 "standard input/output" 的缩写&#xff0c;它提…

【Llama 2的使用方法】

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

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

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

EasyExcel动态表头多sheet导出,单元格操作样式,自动修改单元格格式

EasyExcel动态表头多sheet导出,单元格操作样式,自动修改单元格格式 说明 EasyExcel是一款开源的Java库&#xff0c;用于读取、写入和操作Excel文件。它是阿里巴巴集团开发的一款高效、功能丰富且易于使用的Excel操作工具。 EasyExcel提供了简洁的API&#xff0c;使得读写Excel…

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

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

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

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

Redis 典型应用——缓存(缓存预热,穿透,雪崩,击穿)

一、缓存 缓存是计算机中一个很经典的概念&#xff0c;核心思路是把一些常用的数据放到访问速度更快的地方&#xff0c;方便随时读取&#xff1b; 但对于计算机硬件来说&#xff0c;往往访问速度越快的设备&#xff0c;成本越高&#xff0c;存储空间越小&#xff0c;缓存是更…

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

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

前后端数据交互流程

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

Java 判断两个日期 相差几天

// 入参 为 Date 例如 &#xff1a;Date1 datenew Date();long dayCount (date1.getTime() - date1.getTime()) / 86400000;

消息中间件常用命令

一、Nginx篇 1.1 启动Nginx start nginx 1.2 停止Nginx nginx.exe -s stop 1.3 清理缓存 nginx.exe -s reload 1.4 重新打开日志文件 nginx.exe -s reopen 1.5 查看Nginx版本 nginx -v 1.6 彻底停用Nginx taskkill /f /t /im nginx.exe

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

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

回调函数在异步编程中的作用与实现方式

回调函数在异步编程中的作用与实现方式 大家好&#xff0c;我是微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在计算机编程中&#xff0c;回调函数是指通过将函数作为参数传递给其他函数&#xff0c;使得该函数在特定事件…

使用 HTTPS 已成为网站的标配了

网站使用HTTPS的原因 背景&#xff1a;十年前&#xff0c;HTTPS并不普遍&#xff0c;但随着网络安全意识的提高&#xff0c;现在已成为网站标配。 网站升级到HTTPS的动机 安全问题&#xff1a;HTTP缺乏安全机制&#xff0c;易被窃取和篡改数据。例如&#xff0c;电信运营商劫…