我从中检索到的Userprincipal是否SecurityContextHolder绑定到请求或会话?
SecurityContextHolder
UserPrincipal principal = (UserPrincipal) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
这是我访问当前登录用户的方式。如果当前会话被破坏,这将无效吗?
这取决于你如何配置它(或者说,你可以配置其他行为)。
在Web应用程序中,你将使用与ThreadLocalSecurityContextHolderStrategy交互的SecurityContextPersistenceFilter。
ThreadLocalSecurityContextHolderStrategy
SecurityContextPersistenceFilter
的Java文档SecurityContextPersistenceFilter以:
在请求之前,使用从已配置的{@link SecurityContextRepository}获取的信息填充{@link SecurityContextHolder},并在请求完成并清除上下文所有者后将其存储回存储库中。默认情况下,它使用{@link HttpSessionSecurityContextRepository}。请参阅此类以获取与HttpSession相关的配置选项的信息。
顺便说一句:HttpSessionSecurityContextRepository是SecurityContextRepository的唯一实现(我在默认库中找到了)
它是这样的:
HttpSessionSecurityContextRepository
HttpSession
SecurityContext
SecurityContextRepository
SecurityContextHolder(SecurityContextHolder#setContext)
setContext
getContext
a SecurityContextHolderStrategy
set-
get-Context
因此,总而言之:用户主体(SecurityContext的元素)存储在HTTP会话中。对于每个请求,它都放在访问它的本地线程中。