【问题标题】: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>。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-07
      • 2013-07-08
      • 2017-04-25
      • 1970-01-01
      • 1970-01-01
      • 2015-08-17
      • 2019-04-28
      相关资源
      最近更新 更多