Userprincipal是否从SecurityContextHolder
检索绑定到请求或会话?Spring安全性的SecurityContextHolder:会话或请求绑定?
UserPrincipal principal = (UserPrincipal) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
这是我访问当前登录的用户的方式。如果当前会话被销毁,这会失效吗?
Userprincipal是否从SecurityContextHolder
检索绑定到请求或会话?Spring安全性的SecurityContextHolder:会话或请求绑定?
UserPrincipal principal = (UserPrincipal) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
这是我访问当前登录的用户的方式。如果当前会话被销毁,这会失效吗?
这取决于你如何配置它(或者说,你可以配置一个不同的行为)。
在Web应用程序中,您将使用与SecurityContextPersistenceFilter
交互的ThreadLocalSecurityContextHolderStrategy
。
该爪哇SecurityContextPersistenceFilter
开始于文档:
填充{@link SecurityContextHolder中}与来自配置的 获得 信息{@link SecurityContextRepository}之前 请求并将其存储回 存储库一旦请求已完成 并清除上下文 持有者。默认情况下,它使用{@link HttpSessionSecurityContextRepository}。 查看此类信息 HttpSession相关 配置选项。
BTW:HttpSessionSecurityContextRepository是SecurityContextRepository的唯一实现(我已经在默认库中找到)
它的工作原理是这样的:
HttpSessionSecurityContextRepository
使用HttpSession中(关键=” SPRING_SECURITY_CONTEXT“)来存储一个SecurityContext
对象。SecurityContextPersistenceFilter
是一个过滤器,它使用SecurityContextRepository
例如HttpSessionSecurityContextRepository
加载和存储SecurityContext
对象。如果一个HttpRequest通过过滤器,过滤器获取从存储库中SecurityContext
,并把它放在SecurityContextHolder里(SecurityContextHolder#setContext
)SecurityContextHolder
有两个方法setContext
和getContext
。两者都使用SecurityContextHolderStrategy
来指定在set-和get-Context方法中完成了什么。 - 例如,ThreadLocalSecurityContextHolderStrategy
使用本地线程来存储上下文。所以总结:用户主体(SecurityContext的元素)存储在HTTP会话中。并且对于每个请求,它都会放入您访问它的本地线程中。