首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SecurityContextHolder.getContext().getAuthentication()是如何工作的?

SecurityContextHolder.getContext().getAuthentication()是如何工作的?
EN

Stack Overflow用户
提问于 2020-09-14 17:09:04
回答 1查看 1.3K关注 0票数 0

SecurityContextHolder.getContext().getAuthentication()获得当前经过身份验证的主体或身份验证请求令牌,但我们应该在哪个上下文中使用它?线程安全吗?例如,如果我们使用如下的静态助手方法:

代码语言:javascript
运行
复制
public static UserEntity getCurrentUser() {
        return (UserEntity)SecurityContextHolder.getContext().getAuthentication().getPrincipal();
}

用起来安全吗?或者我们应该只在请求作用域bean下使用它?

EN

Stack Overflow用户

回答已采纳

发布于 2020-09-20 08:03:15

来自Spring安全文档:

默认情况下,SecurityContextHolder使用ThreadLocal来存储这些详细信息,这意味着SecurityContext始终可供同一线程中的方法使用,即使SecurityContext没有作为参数显式传递给这些方法。如果在处理当前主体的请求之后清除线程,以这种方式使用ThreadLocal是非常安全的。Security的FilterChainProxy确保始终清除SecurityContext。

根据这个博客

Java ThreadLocal类允许您创建只能由同一个线程读取和写入的变量。因此,即使两个线程正在执行相同的代码,并且代码对同一个ThreadLocal变量有一个引用,这两个线程也不能看到对方的ThreadLocal变量。因此,Java ThreadLocal类提供了一种简单的方法,使代码线程安全,否则就不会如此。

将这些组合在一起可以回答一个问题,即使用静态util方法从SecurityContextHolder获取当前登录的用户是安全的,也就是说,是安全的

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63888901

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档