【问题标题】:How SecurityContextHolder.getContext().getAuthentication() worksSecurityContextHolder.getContext().getAuthentication() 如何工作
【发布时间】:2020-09-20 16:03:15
【问题描述】:
SecurityContextHolder.getContext().getAuthentication() 获取当前经过身份验证的主体,或身份验证请求令牌。但是,我们应该在什么情况下使用它?它是线程安全的吗?例如,如果我们使用静态辅助方法,例如:
public static UserEntity getCurrentUser() {
return (UserEntity)SecurityContextHolder.getContext().getAuthentication().getPrincipal();
}
使用安全吗?
或者,我们应该只在请求范围的 bean 下使用它?
【问题讨论】:
标签:
spring
spring-mvc
spring-security
【解决方案1】:
来自 Spring Security 文档:
默认情况下,SecurityContextHolder 使用 ThreadLocal 来存储这些
详细信息,这意味着 SecurityContext 始终可用于
同一线程中的方法,即使 SecurityContext 不是
作为参数显式传递给这些方法。用一个
如果小心清除
处理当前委托人的请求后的线程。春天
Security 的 FilterChainProxy 确保 SecurityContext 总是
清除。
根据this blog:
Java ThreadLocal 类使您能够创建变量,这些变量可以
只能由同一个线程读写。因此,即使两个线程
正在执行相同的代码,并且该代码具有相同的引用
ThreadLocal 变量,两个线程看不到对方的
线程局部变量。因此,Java ThreadLocal 类提供了一个
使代码线程安全的简单方法,否则不会如此。
将这些放在一起回答了使用静态 util 方法从 SecurityContextHolder 获取当前登录用户是否安全的问题,即,是的,它是安全的 em>。