SecurityContextPersistenceFilter

SecurityContextPersistenceFilter

我从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有两种方法setContextgetContext。两者都使用SecurityContextHolderStrategy来指定在set-和get-Context方法中到底要执行什么操作。 -例如,ThreadLocalSecurityContextHolderStrategy使用本地线程存储上下文。

  • 因此,总而言之:用户主体(SecurityContext的元素)存储在HTTP session 中。对于每个请求,它都放在访问它的本地线程中。

    10-01 17:31