Java Spring security';s SecurityContextHolder:会话还是请求绑定?
我从Java Spring security';s SecurityContextHolder:会话还是请求绑定?,java,spring,jakarta-ee,spring-security,Java,Spring,Jakarta Ee,Spring Security,我从SecurityContextHolder检索的Userprincipal是否绑定到请求或会话 UserPrincipal=(UserPrincipal)SecurityContextHolder.getContext().getAuthentication().getPrincipal() 这是我访问当前登录用户的方式。如果当前会话被破坏,这会失效吗?这取决于您如何配置它(或者说,您可以配置不同的行为) 在Web应用程序中,您将使用与进行交互的 SecurityContextPersist
SecurityContextHolder
检索的Userprincipal是否绑定到请求或会话
UserPrincipal=(UserPrincipal)SecurityContextHolder.getContext().getAuthentication().getPrincipal()代码>
这是我访问当前登录用户的方式。如果当前会话被破坏,这会失效吗?这取决于您如何配置它(或者说,您可以配置不同的行为)
在Web应用程序中,您将使用与进行交互的
SecurityContextPersistenceFilter的Java文档以以下内容开头:
填充{@链接
SecurityContextHolder}具有
从
配置的{@link
SecurityContextRepository}在
请求并将其存储回
请求完成后存储库
完成并清除上下文
持有人默认情况下,它使用{@link
HttpSessionSecurityContextRepository}。
有关信息,请参见本课程
HttpSession相关
配置选项
顺便说一句:HttpSessionSecurityContextRepository是SecurityContextRepository的唯一实现(我在默认libs中找到了)
它的工作原理如下:
- 使用httpSession(Key=“SPRING\u SECURITY\u CONTEXT”)存储
SecurityContext
对象
SecurityContextPersistenceFilter
是一个使用securitycontextextrepository
的过滤器,例如httpsessionsecuritycontextextrepository
来加载和存储SecurityContext
对象。如果HttpRequest通过筛选器,筛选器将从存储库中获取SecurityContext
,并将其放入SecurityContextHolder(SecurityContextHolder\setContext
)
SecurityContextHolder
有两种方法setContext
和getContext
。两者都使用SecurityContextHolderStrategy
来指定在set-and-get-Context方法中到底做了什么。-例如,ThreadLocalSecurityContextHolderStrategy
使用线程本地存储上下文
总之,用户主体(SecurityContext的元素)存储在HTTP会话中。对于每个请求,它都放在一个本地线程中,您可以从那里访问它