我从SecurityContextHolder
检索的Userprincipal是否绑定(bind)到请求或 session ?UserPrincipal principal = (UserPrincipal) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
这是我访问当前登录用户的方式。如果当前 session 被破坏,这将无效吗?
最佳答案
这取决于您如何配置它(或者说,您可以配置其他行为)。
在Web应用程序中,您将使用与 ThreadLocalSecurityContextHolderStrategy
交互的 SecurityContextPersistenceFilter
。SecurityContextPersistenceFilter
的Java文档以以下内容开头:
顺便说一句:HttpSessionSecurityContextRepository是SecurityContextRepository的唯一实现(我在默认库中找到了)
它是这样的:
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 session 中。对于每个请求,它都放在访问它的本地线程中。