gpt4 book ai didi

java - Spring Security 的 SecurityContextHolder : session or request bound?

转载 作者:IT老高 更新时间:2023-10-28 13:02:11 25 4
gpt4 key购买 nike

我从 SecurityContextHolder 检索到的 Userprincipal 是否绑定(bind)到请求或 session ?

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

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

最佳答案

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

在 Web 应用程序中,您将使用 ThreadLocalSecurityContextHolderStrategySecurityContextPersistenceFilter 交互.

SecurityContextPersistenceFilter的Java Doc开头:

Populates the {@link SecurityContextHolder} with information obtained from the configured {@link SecurityContextRepository} prior to the request and stores it back in the repository once the request has completed and clearing the context holder. By default it uses an {@link HttpSessionSecurityContextRepository}. See this class for information HttpSession related configuration options.

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

它是这样工作的:

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

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

关于java - Spring Security 的 SecurityContextHolder : session or request bound?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6408007/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com