一尘不染

Spring Security的SecurityContextHolder:会话或请求绑定?

spring

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

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

这是我访问当前登录用户的方式。如果当前会话被破坏,这将无效吗?


阅读 849

收藏
2020-04-12

共1个答案

一尘不染

这取决于你如何配置它(或者说,你可以配置其他行为)。

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

的Java文档SecurityContextPersistenceFilter以:

在请求之前,使用从已配置的{@link SecurityContextRepository}获取的信息填充{@link SecurityContextHolder},并在请求完成并清除上下文所有者后将其存储回存储库中。默认情况下,它使用{@link HttpSessionSecurityContextRepository}。请参阅此类以获取与HttpSession相关的配置选项的信息。

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

它是这样的:

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

因此,总而言之:用户主体(SecurityContext的元素)存储在HTTP会话中。对于每个请求,它都放在访问它的本地线程中。

2020-04-12