繁体   English   中英

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

[英]Spring security's SecurityContextHolder: session or request bound?

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

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

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

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

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

SecurityContextPersistenceFilter的Java Doc开头于:

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

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

它的工作原理如下:

  • 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会话中。 对于每个请求,它都放在您访问它的本地线程中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM