SecurityContextHolder.getContext().getAuthentication()
获得当前经过身份验证的主体或身份验证请求令牌,但我们应该在哪个上下文中使用它?线程安全吗?例如,如果我们使用如下的静态助手方法:
public static UserEntity getCurrentUser() {
return (UserEntity)SecurityContextHolder.getContext().getAuthentication().getPrincipal();
}
用起来安全吗?或者我们应该只在请求作用域bean下使用它?
发布于 2020-09-20 08:03:15
来自Spring安全文档:
默认情况下,SecurityContextHolder使用ThreadLocal来存储这些详细信息,这意味着SecurityContext始终可供同一线程中的方法使用,即使SecurityContext没有作为参数显式传递给这些方法。如果在处理当前主体的请求之后清除线程,以这种方式使用ThreadLocal是非常安全的。Security的FilterChainProxy确保始终清除SecurityContext。
根据这个博客:
Java ThreadLocal类允许您创建只能由同一个线程读取和写入的变量。因此,即使两个线程正在执行相同的代码,并且代码对同一个ThreadLocal变量有一个引用,这两个线程也不能看到对方的ThreadLocal变量。因此,Java ThreadLocal类提供了一种简单的方法,使代码线程安全,否则就不会如此。
将这些组合在一起可以回答一个问题,即使用静态util方法从SecurityContextHolder
获取当前登录的用户是安全的,也就是说,是安全的。
https://stackoverflow.com/questions/63888901
复制相似问题