java - SecurityContextHolder 线程安全吗?

标签 java spring spring-mvc spring-security

我使用 SecurityContextHolder 和自定义 UserDetailsS​​erviceSecurityContextHolder 获取 UserDetails:

Object o = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
UserDetailsDTO user = (UserDetailsDTO) o;

我遗漏了空检查等,但就是这样。我在 @Aspect@Around 切入点中使用它:

@Around("execution(* user.service.*.*(..))")
public Object audit(ProceedingJoinPoint call) throws Throwable {
     // get user id
     // add audit row in db
}

查看 SecurityContextHolder 类,它默认使用 ThreadLocal,但切入点似乎也有某种封装的线程逻辑。

是否可能存在用户冲突(即从一个 session 访问 UserA 以获取另一个并发 session 中的 UserB 审核事件),或者可能完全是一个空用户。

是否有更好的方法来获取凭据/用户配置文件?

最佳答案

是的,默认策略 (MODE_THREADLOCAL) 是线程安全的(只要您不尝试即时更改策略)。但是,如果您希望生成的线程继承父线程的 SecurityContext,则应设置 MODE_INHERITABLETHREADLOCAL

方面也没有任何“线程逻辑”,它们与建议的方法在同一线程中执行。

关于java - SecurityContextHolder 线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2291942/

相关文章:

java - 在同一字段上读取和写入不同的 @JsonProperty 配置?

java - 如何将浮点条目的二维数组克隆到另一个类似类型和大小的二维数组?

Spring 在集成测试中 Autowiring HttpServletRequest

spring - OAUTH的Spring Rest模板

spring-mvc - Spring Boot 不使用配置的 Jackson ObjectMapper 和 @EnableWebMvc

java - 当 GC 暂停持续时间超过平均响应时间时,如何限制 webapp 中的并发?

java - 如何防止spring security在登录成功后重定向到上一页?

spring - 为什么 @MockBean 和 @InjectMocks 导致 BeanCreationException?

java - Spring 限定符错误

java - 在spring mvc中按名称获取cookie值