4

我有一些关于 Spring Security 3.0.5 和 SecurityContext 的问题。首先,我试着总结一下我所知道的:

  • SecurityContextHolder 存储 SecurityContext
  • Request之间,SecurityContext存储在HttpSession中
  • 请求开始:SecurityContextHolder 从 HttpSession 获取 SecurityContext
  • 请求结束:SecurityContextHolder 将 SecurityContext 放入 HttpSession

  • 在请求期间,在服务器上,SecurityContextHolder 使用 ThreadLocal。在应用程序的任何地方(相同的请求),都可以访问 SecurityContext

现在我的问题....

--> 两个请求:SecurityContext-instance 将被共享

这是如何运作的?我的意思是,SecurityContextHolder 对每个请求都使用 ThreadLocal。2 请求 = 2 ThreadLocals

每个请求都会: 从 HttpSession 中获取会话属性 (SecurityContext) 如果它们在 SecurityContext 上工作会发生什么?所有 ThreadLocals 中的 SecurityContext 是否都发生了变化?

据我所知:是的(??)

这是如何运作的?它们如何在同一个实例上工作?我的意思是,我真的无法想象具有两个不同 ThreadLocals 的两个不同线程如何在同一个实例上工作?

API (ThreadLocal):此类提供线程局部变量。这些变量不同于它们的正常对应变量,因为每个访问一个(通过它的 get 或 set 方法)的线程都有它自己的、独立初始化的变量副本。

我的意思是,就是这样:复制!也许我错了,两个线程不可能在同一个SecurityContext上工作?但是 Spring Security 文档是这么说的!

如果有人能向我解释一下就好了:-)谢谢!

4

1 回答 1

2

每个线程都有自己的 值ThreadLocal,但没有什么能阻止这些值相等。因此,在这种情况下,多个线程将引用相同的SecurityContext.

通常这不是问题,但是如果您想修改安全上下文,您可以启用防御性复制,请参阅SEC-356

于 2011-06-16T18:01:35.603 回答