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

时间:2011-06-20 07:24:19

标签: java spring java-ee spring-security

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

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

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

1 个答案:

答案 0 :(得分:109)

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

在网络应用程序中,您将使用与ThreadLocalSecurityContextHolderStrategy互动的SecurityContextPersistenceFilter

SecurityContextPersistenceFilter的Java文档以:

开头
  

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

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