【问题标题】:Spring security's SecurityContextHolder: session or request bound?Spring security 的 SecurityContextHolder:会话或请求绑定?
【发布时间】:2011-09-18 11:27:24
【问题描述】:

我从 SecurityContextHolder 检索到的 Userprincipal 是否绑定到请求或会话?

UserPrincipal principal = (UserPrincipal) SecurityContextHolder.getContext().getAuthentication().getPrincipal();

这是我访问当前登录用户的方式。如果当前会话被销毁,这是否会失效?

【问题讨论】:

    标签: java spring jakarta-ee spring-security


    【解决方案1】:

    这取决于您如何配置它(或者说,您可以配置不同的行为)。

    在 Web 应用程序中,您将使用与 SecurityContextPersistenceFilter 交互的 ThreadLocalSecurityContextHolderStrategy。

    SecurityContextPersistenceFilter 的 Java Doc 开头为:

    填充 {@link SecurityContextHolder} 与 从获得的信息 已配置 {@link SecurityContextRepository} 之前 请求并将其存储回 一旦请求有存储库 完成并清除上下文 持有者。默认情况下,它使用 {@link HttpSessionSecurityContextRepository}。 有关信息,请参阅本课程 HttpSession相关 配置选项。

    顺便说一句:HttpSessionSecurityContextRepository 是 SecurityContextRepository 的唯一实现(我在默认库中找到了)

    它是这样工作的:

    • HttpSessionSecurityContextRepository 使用 httpSession (Key="SPRING_SECURITY_CONTEXT") 来存储 SecurityContext 对象。
    • SecurityContextPersistenceFilter 是一个过滤器,它使用SecurityContextRepository 例如HttpSessionSecurityContextRepository 来加载和存储SecurityContext 对象。如果 HttpRequest 通过过滤器,过滤器从存储库中获取SecurityContext 并将其放入 SecurityContextHolder (SecurityContextHolder#setContext)
    • SecurityContextHolder 有两个方法setContext 和getContext。两者都使用SecurityContextHolderStrategy 来指定在 set- 和 get-Context 方法中究竟做了什么。 - 例如ThreadLocalSecurityContextHolderStrategy 使用本地线程来存储上下文。

    总而言之:用户主体(SecurityContext 的元素)存储在 HTTP 会话中。对于每个请求,它都被放入一个本地线程中,您可以从那里访问它。

    【讨论】:

      猜你喜欢
      • 2019-09-08
      • 2011-08-19
      • 2013-05-27
      • 1970-01-01
      • 2011-04-25
      • 2011-03-28
      • 2014-03-06
      • 1970-01-01
      • 2020-01-31
      相关资源
      最近更新 更多