Spring安全性的SecurityContextHolder:会话或请求绑定?
Userprincipal从SecurityContextHolder
检索绑定到请求或会话?
UserPrincipal principal = (UserPrincipal) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
这是我访问当前login的用户的方式。 如果当前会话被破坏,这会失效吗?
这取决于你如何configuration它(或者可以说,你可以configuration一个不同的行为)。
在Web应用程序中,您将使用与SecurityContextPersistenceFilter
交互的ThreadLocalSecurityContextHolderStrategy
。
SecurityContextPersistenceFilter
的Java Doc开始于:
一旦请求完成并清除上下文持有者,就会在请求之前使用从configuration的{@ Security SecurityConpository}获得的信息填充{@link SecurityContextHolder},并将其存储回存储库中。 默认情况下,它使用{@link HttpSessionSecurityContextRepository}。 看到这个类的信息HttpSession相关的configuration选项。
顺便说一句:HttpSessionSecurityContextRepository是SecurityContextRepository的唯一实现(我已经在默认的库中find)
它是这样工作的:
-
HttpSessionSecurityContextRepository
使用httpSession(Key =“SPRING_SECURITY_CONTEXT”)来存储一个SecurityContext
对象。 -
SecurityContextPersistenceFilter
是使用SecurityContextPersistenceFilter
的filter,例如HttpSessionSecurityContextRepository
来加载和存储SecurityContext
对象。 如果HttpRequest通过filter,filter从存储库获取SecurityContext
,并将其置于SecurityContextHolder(SecurityContextHolder#setContext
) -
SecurityContextHolder
有两个方法setContext
和getContext
。 两者都使用SecurityContextHolderStrategy
来指定在set-和get-Context方法中完成的工作。 – 例如ThreadLocalSecurityContextHolderStrategy
使用本地线程来存储上下文。
所以总结:用户主体(SecurityContext的元素)存储在HTTP会话中。 而且对于每个请求,它都被放置在你访问它的地方的一个线程中。