我从SecurityContextHolder
检索的Userprincipal是绑定到请求还是会话?
UserPrincipal principal = (UserPrincipal) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
这是我访问当前登录用户的方式。如果当前会话被销毁,这会无效吗?
答案 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
有两种方法setContext
和getContext
。两者都使用SecurityContextHolderStrategy
来指定set-和get-Context方法中的确切操作。 - 例如,ThreadLocalSecurityContextHolderStrategy
使用本地线程来存储上下文。总结:用户主体(SecurityContext的元素)存储在HTTP会话中。对于每个请求,它都放在您访问它的本地线程中。