[英]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
有两个方法setContext
和getContext
。 两者都使用SecurityContextHolderStrategy
来指定set-和get-Context方法中的确切操作。 - 例如, ThreadLocalSecurityContextHolderStrategy
使用本地线程来存储上下文。 总而言之:用户主体(SecurityContext的元素)存储在HTTP会话中。 对于每个请求,它都放在您访问它的本地线程中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.