SecurityContextHolder.getContext()获取不到Security上下文数据?

一、问题描述

SecurityContextHolder.getContext()获取不到Security上下文数据?

二、原因

我的项目中出现这个问题是由于使用了异步线程(如下),导致Security上下文无法从主线程传递到异步线程中。

threadPoolTaskExecutor.execute(()->{
	// ...
	SecurityContext context = SecurityContextHolder.getContext();
	// ...
})
三、解决方案
1. 修改SpringSecurity的安全策略(不推荐)
# 修改配置(在这种模式下,安全上下文信息存储在当前线程的 InheritableThreadLocal 中,可以被该线程创建的子线程继承和共享。默认是MODE_THREADLOCAL)
spring.security.strategy=MODE_INHERITABLETHREADLOCAL

不推荐原因:
在使用 MODE_INHERITABLETHREADLOCAL 安全策略时,您需要小心处理多线程环境下的安全性问题,以避免出现数据竞争、死锁等问题。同时,这种模式可能会对应用程序的性能产生一定的影响,因为它需要通过序列化和反序列化来传递安全上下文信息。因此,在使用 MODE_INHERITABLETHREADLOCAL 安全策略时需要小心,确保在必要的情况下使用它,以避免性能问题。

2. 使用DelegatingSecurityContextRunnable在异步线程中正确地传递 Spring Security 上下文信息。如下
threadPoolTaskExecutor.execute(new DelegatingSecurityContextRunnable(() -> {
	// ...
	SecurityContext context = SecurityContextHolder.getContext();
	// ...
})
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值