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

chz*_*gla 60 java spring spring-security java-ee

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

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

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

Ral*_*lph 110

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

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

Java Doc的SecurityContextPersistenceFilter开头是:

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

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

它的工作原理如下:

  • HttpSessionSecurityContextRepository使用在HttpSession(密钥="SPRING_SECURITY_CONTEXT")来存储一个SecurityContext对象.
  • SecurityContextPersistenceFilter是一个过滤器,使用SecurityContextRepository例如 HttpSessionSecurityContextRepository加载和存储SecurityContext对象.如果HttpRequest通过过滤器,则过滤器SecurityContext从存储库获取并将其放入SecurityContextHolder(SecurityContextHolder#setContext)
  • SecurityContextHolder有两个方法setContextgetContext.两者都使用a SecurityContextHolderStrategy来指定set-和get-Context方法中的确切操作.- 例如,ThreadLocalSecurityContextHolderStrategy使用本地线程来存储上下文.

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