Spring-Security-5.7.11升级6.5.2

1.Session Management

1.1.必须明确调用SecurityContextRepository保存SecurityContext

在Spring Security 5中,默认行为是SecurityContext使用SecurityContextPersistenceFilter自动保存到SecurityContextRepository

//版本5.7.11
//SecurityContextPersistenceFilter中核心代码
HttpRequestResponseHolder holder = new HttpRequestResponseHolder(request, response);SecurityContext contextBeforeChainExecution = this.repo.loadContext(holder);try {SecurityContextHolder.setContext(contextBeforeChainExecution);//...}finally {SecurityContext contextAfterChainExecution = SecurityContextHolder.getContext();SecurityContextHolder.clearContext();// 保存this.repo.saveContext(contextAfterChainExecution, holder.getRequest(), holder.getResponse());}

SecurityContextPersistenceFilter已被作废

在Spring Security 6中,默认行为是SecurityContextHolderFilter只会从SecurityContextRepository读取SecurityContext并将其填充到SecurityContextHolder中。如果用户希望SecurityContext在请求之间保持不变,他们现在必须使用SecurityContextRepository显式保存SecurityContext

//版本6.5.2
private void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)throws ServletException, IOException {Supplier<SecurityContext> deferredContext = this.securityContextRepository.loadDeferredContext(request);try {this.securityContextHolderStrategy.setDeferredContext(deferredContext);chain.doFilter(request, response);}finally {// 没有保存this.securityContextHolderStrategy.clearContext();request.removeAttribute(FILTER_APPLIED);}}

1.2.登录成功的通用保存逻辑

如果是登录成功,根据不同的登录方式设置,以下是必须要设置的

// 版本6.5.2
SecurityContext context = this.securityContextHolderStrategy.createEmptyContext();
context.setAuthentication(authenticationResult);
this.securityContextHolderStrategy.setContext(context);
this.securityContextRepository.saveContext(context, request, response);

用户名密码登录可参见AbstractAuthenticationProcessingFilter

//版本5.7.11
protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain,Authentication authResult) throws IOException, ServletException {SecurityContext context = SecurityContextHolder.createEmptyContext();context.setAuthentication(authResult);SecurityContextHolder.setContext(context);this.securityContextRepository.saveContext(context, request, response);if (this.logger.isDebugEnabled()) {this.logger.debug(LogMessage.format("Set SecurityContextHolder to %s", authResult));}this.rememberMeServices.loginSuccess(request, response, authResult);if (this.eventPublisher != null) {this.eventPublisher.publishEvent(new InteractiveAuthenticationSuccessEvent(authResult, this.getClass()));}this.successHandler.onAuthenticationSuccess(request, response, authResult);}
​
// 版本6.5.2
private SecurityContextHolderStrategy securityContextHolderStrategy = SecurityContextHolder.getContextHolderStrategy();
​
protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain,Authentication authResult) throws IOException, ServletException {//创建SecurityContext的对象不同SecurityContext context = this.securityContextHolderStrategy.createEmptyContext();context.setAuthentication(authResult);this.securityContextHolderStrategy.setContext(context);// 显示保存this.securityContextRepository.saveContext(context, request, response);if (this.logger.isDebugEnabled()) {this.logger.debug(LogMessage.format("Set SecurityContextHolder to %s", authResult));}this.rememberMeServices.loginSuccess(request, response, authResult);if (this.eventPublisher != null) {this.eventPublisher.publishEvent(new InteractiveAuthenticationSuccessEvent(authResult, this.getClass()));}this.successHandler.onAuthenticationSuccess(request, response, authResult);}

1.3.SecurityContextRepository默认的初始化

//版本6.5.2
HttpSessionSecurityContextRepository httpSecurityRepository = new HttpSessionSecurityContextRepository();
DelegatingSecurityContextRepository defaultRepository = new DelegatingSecurityContextRepository(httpSecurityRepository, new RequestAttributeSecurityContextRepository());
return defaultRepository;
​
//版本5.7.11
HttpSessionSecurityContextRepository httpSecurityRepository; = new HttpSessionSecurityContextRepository();
return httpSecurityRepository;

1.4.SecurityContextRepository的接口

public interface SecurityContextRepository {
​//5.7.11中使用的接口@DeprecatedSecurityContext loadContext(HttpRequestResponseHolder requestResponseHolder);
​//最新6.5.2中使用接口,目前兼容,作废的loadContext后续会被删除default DeferredSecurityContext loadDeferredContext(HttpServletRequest request) {Supplier<SecurityContext> supplier = () -> loadContext(new HttpRequestResponseHolder(request, null));return new SupplierDeferredSecurityContext(SingletonSupplier.of(supplier),SecurityContextHolder.getContextHolderStrategy());}
​void saveContext(SecurityContext context, HttpServletRequest request, HttpServletResponse response);
​
​boolean containsContext(HttpServletRequest request);
}

2.csrf的token

 private CsrfTokenRepository tokenRepository;
​
//5.7.11通过一下方法获取
CsrfToken token = tokenRepository.loadToken(request);
if (token != null) {userDetails.getUserDTO().setToken(token.getToken());
}
​
//6.5.2使用以下方式
DeferredCsrfToken token = tokenRepository.loadDeferredToken(request, response);
if (token != null) {userDetails.getUserDTO().setToken(token.get().getToken());
}

3.授权

//5.7.11 使用以下方式 在6中已被标记作废
FilterSecurityInterceptor AccessDecisionManager//6.5.2 已通过
AuthorizationManager控制public void customize(AuthorizeHttpRequestsConfigurer<HttpSecurity>.AuthorizationManagerRequestMatcherRegistry authorizationManagerRequestMatcherRegistry) {HttpSecurity http = authorizationManagerRequestMatcherRegistry.and();
​AuthorizationManager<RequestAuthorizationContext> requestAuthorizationManager =  new xxxx
​authorizationManagerRequestMatcherRegistry.requestMatchers(accessRequestMatcherToArray()).access(xxRequestAuthorizationManager);
}  

4.SecurityFilterChain的配置

<1>HttpSecurity中的apply方法将被作废

//升级前   
http.apply(xxxCaptchaVerifier())
//升级后    
http.with(xxxCaptchaVerifier(), withDefaults())

<2>xxExceptionHandlingCustomizerand方法将被作废,主要获取HttpSecurity,然后获取ApplicationContext,获取Bean

// 升级前
public class XxExceptionHandlingCustomizer extends XxAbstractCustomizer<ExceptionHandlingConfigurer<HttpSecurity>> {@Overridepublic void customize(ExceptionHandlingConfigurer<HttpSecurity> exceptionHandlingConfigurer) {//.and()已作废HttpSecurity http = exceptionHandlingConfigurer.and();Http401UnauthorizedEntryPoint http401UnauthorizedEntryPoint = getBean(http, Http401UnauthorizedEntryPoint.class);}
}// 升级后
public class XxExceptionHandlingCustomizer extends XxAbstractCustomizer<ExceptionHandlingConfigurer<HttpSecurity>> {public XxExceptionHandlingCustomizer(ApplicationContext context) {super(context);}@Overridepublic void customize(ExceptionHandlingConfigurer<HttpSecurity> exceptionHandlingConfigurer) {Http401UnauthorizedEntryPoint http401UnauthorizedEntryPoint = getBean(Http401UnauthorizedEntryPoint.class);exceptionHandlingConfigurer.authenticationEntryPoint(http401UnauthorizedEntryPoint);}}

<3>HttpSecurity中多个配置不在使用and方法,统一使用Customizer<T>接口配置

//升级前
http.cors().and().securityContext(xxxSecurityContextCustomizer())    //升级后     //只开启cors,不自定义配置
http.cors(withDefaults());
//开启cors,自定义配置   
http.cors(corsConfigurer -> {})

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

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

相关文章

docker下载安装和使用(Hyper-V方式)

1.环境准备 左键单击电脑左下角开始按钮—>点击“设置”—>搜索“Windows功能”—>启用或关闭Windows功能—>勾选Hyper-v&#xff0c;启用后电脑会重启&#xff0c;安装环境配置成功。 选择 Hyper-v2.下载docker docker官网下载地址&#xff1a;https://www.docker…

【消息队列】RabbitMQ “消息队列模式” 以及NET8集成

在 .NET 8 中集成 RabbitMQ 消息队列&#xff0c;可以使用官方推荐的 RabbitMQ.Client 库或封装好的 MassTransit/EasyNetQ 等高级库。以下是 RabbitMQ 的基本集成代码 和 常见消息模式 的实现。 RabbitMQ 本身并没有直接支持延时消息的功能&#xff0c;但是可以通过一些机制来…

Docker 镜像常见标签(如 `标准`、`slim`、`alpine` 和 `noble`)详细对比

以下是 Docker 镜像常见标签&#xff08;如 标准、slim、alpine 和 noble&#xff09;的详细对比&#xff0c;涵盖基础系统、体积、适用场景及注意事项&#xff1a;1. 标准镜像&#xff08;无后缀&#xff09; 基础系统&#xff1a;完整 Linux 发行版&#xff08;如 Debian、Ub…

(1-9-2)Java 工厂模式

目录 1.设计模式与分类 2. 工厂模式 2.1 工厂模式概述 2.2 简单工厂 2.3 学生推荐就业Demo 00.项目目录 01. 创建抽象接口Job 02. 创建实体类 03. 创建推荐工作工厂类 04. 创建学生推荐就业客户类 3. i18n国际化语言标题自适应 00. 实现效果 01. 创建抽象接口 02…

QT远程开发技巧

交叉编译时野火提供的文件 交叉编译器 GNU官网可以下载, QT库文件这里给的QT-everyWhere版本,是开源版本需要自行编译。(远程服务器通常是PC架构【AMD64】,直接apt-get install下载的qt也是Pc架构的,不能直接在板卡【ARM64】上运行,必须对源码交叉编译) 注意QT遵从GPL开源…

Linux操作系统从入门到实战(十九)进程状态

Linux操作系统从入门到实战&#xff08;十九&#xff09;进程状态前言一、什么是进程状态二、状态本质三、最核心的3种状态1. 就绪状态2. 运行状态3. 阻塞状态四、状态变化的核心1/两种资源如何影响状态&#xff1f;五、操作系统怎么管理这些状态&#xff1f;六、Linux里结构体…

容器技术之docker

容器技术之Docker一、什么是Docker二、为什么会出现Docker2.1 环境一致性问题2.2 虚拟化技术的局限性2.3 微服务架构的兴起三、重要概念3.1 什么是镜像3.2 什么是容器3.3 总结&#xff1a;3.4 Docker仓库四、安装Docker&#xff08;Ubuntu系统下&#xff09;1.卸载老的版本2.更…

数据结构与算法:树状数组

前言 太难了…… 一、树状数组使用场景 树状数组一般用来维护可差分的信息&#xff0c;比如累加和&#xff0c;累乘积等。举个例子&#xff0c;当整个数组的累加和为sum1&#xff0c;一个区间内的累加和为sum2&#xff0c;那么除了这个区间剩下部分的累加和就是sum1-sum2&am…

“一车一码一池一充”:GB 17761-2024新国标下电动自行车的安全革命

2025年9月1日&#xff0c;电动自行车行业将迎来一场深刻变革。随着强制性国家标准GB 17761-2024《电动自行车安全技术规范》的全面实施&#xff0c;我国超3.5亿电动自行车用户的安全出行将获得全新的技术保障。在这场安全升级中&#xff0c;“一车一码一池一充”的全链条管控机…

QT聊天项目DAY18

1.文件传输1.1 客户端采用分块传输(20MB/块)&#xff0c;以及MD5码校验并将读出的二进制数据采用Base64编码进行传输1.1.0 通信协议1.1.1 UI采用垂直布局&#xff0c;该布局大小为570 * 160&#xff0c;间隔全是0&#xff0c;UI方面不详细介绍了1.1.2 MainWindow头文件#ifndef …

centos系统sglang单节点本地部署大模型

前置工作 本地部署大模型的基本概念和前置工作-CSDN博客 模型部署 这里通过docker容器进行部署。我这里是h20*8,部署deepseek-v3-0324,这个配置和模型都比较大,大家根据自己的硬件对应调整 步骤一 我们要通过sglang部署模型,先拉取sglang的docker镜像,这里下载失败的…

【dij算法/最短路/分层图】P4568 [JLOI2011] 飞行路线

题目描述 Alice 和 Bob 现在要乘飞机旅行&#xff0c;他们选择了一家相对便宜的航空公司。该航空公司一共在 nnn 个城市设有业务&#xff0c;设这些城市分别标记为 000 到 n−1n-1n−1&#xff0c;一共有 mmm 种航线&#xff0c;每种航线连接两个城市&#xff0c;并且航线有一定…

告别传统,CVPR三论文用GNN动态图重塑视觉AI

本文选自gongzhonghao【图灵学术SCI论文辅导】关注我们&#xff0c;掌握更多顶会顶刊发文资讯今天&#xff0c;为大家推荐一个极具前沿价值与实用潜力的研究方向&#xff1a;图神经网络&#xff08;GNN&#xff09;。作为深度学习领域的新兴力量&#xff0c;图神经网络在近年顶…

HTTP/HTTPS代理,支持RSA和SM2算法

在日常工作和学习中&#xff0c;我们经常遇到HTTP和HTTPS的相关问题&#xff0c;要解决这些问题&#xff0c;有时就需要搭建各种实验环境&#xff0c;重现业务场景&#xff0c;比如&#xff1a; 将HTTP转为HTTPS。本地只能发送HTTP请求&#xff0c;但是远程服务器却只能接收HT…

如何提高AI写作论文的查重率?推荐七个AI写作论文工具

随着AI技术在学术领域的广泛应用&#xff0c;越来越多的学生和研究人员开始使用AI写作工具来提高写作效率&#xff0c;帮助完成毕业论文、科研论文等。然而&#xff0c;AI生成的内容是否会提高论文的查重率&#xff1f;是否能有效避免重复和提高通过率&#xff1f;这些问题成为…

跨平台、低延迟、可嵌入:实时音视频技术在 AI 控制系统中的进化之路

引言&#xff1a;面向未来的实时音视频基座 在万物互联与智能化加速落地的时代&#xff0c;实时音视频技术早已不再只是社交娱乐的附属功能&#xff0c;而是智慧城市、应急指挥、远程操控、工业智造、教育培训、安防监控等系统的“神经中枢”。一条高性能、可控、低延迟的视频…

Spring WebFlux开发指导

Spring WebFlux是一个响应式的web服务器端应用开发框架&#xff0c;响应式是指&#xff0c;当前端组件的状态发生变化&#xff0c;则生成事件通知&#xff0c;根据需求可异步或者同步地向服务器端接口发送请求&#xff0c;当服务器端网络IO组件的状态发生变化&#xff0c;则生成…

09-docker镜像手动制作

文章目录一.手动制作单服务的nginx镜像1.启动一个基础容器&#xff0c;此处我使用的是centos7镜像。2.修改容器中的软件源3.安装nginx服务并启动nginx服务4.修复nginx的首页文件5.退出容器6.将退出的容器提交为镜像7.测试镜像的可用性二.手动制作多服务的nginx sshd镜像1.启用…

Android.mk教程

语法 Android.mk 的必备三行 LOCAL_PATH : $(call my-dir) # Android.mk的目录&#xff0c;call调用函数include $(CLEAR_VARS) # 除了LOCAL_PATH清除所有LOCAL_XXXinclude $(BUILD_SHARED_LIBRARY) # BUILD_XXX, 指定构建类型 # BUILD_SHARED_LIBRARY → .so动态库 # BUILD…

稠密检索:基于神经嵌入的高效语义搜索范式

本文由「大千AI助手」原创发布&#xff0c;专注用真话讲AI&#xff0c;回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我&#xff0c;一起撕掉过度包装&#xff0c;学习真实的AI技术&#xff01; 1. 背景与定义 稠密检索&#xff08;Dense Retrieval&#xff09;是一…