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

  • SecurityContextHolder存储SecurityContext
  • 在请求之间,SecurityContext存储在HttpSession中
  • 请求的开始:SecurityContextHolder从HttpSession
  • 获取SecurityContext
  • 请求结束:SecurityContextHolder将SecurityContext放入HttpSession
  • 在请求期间,在服务器上,SecurityContextHolder使用ThreadLocal。在应用程序中的任何位置(相同请求),都可以通过
  • 访问SecurityContext

    现在我的问题...

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

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

    每个请求都执行以下操作:HttpSession中的getSessionAttribute(SecurityContext)
    如果它们在SecurityContext上工作会怎样?是否在所有ThreadLocals中都更改了SecurityContext?

    据我所知:是的(??)

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



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

    如果有人可以向我解释这一点,那就太好了:-)谢谢!

    最佳答案

    每个线程都有自己的ThreadLocal值,但是没有什么可以阻止这些值相等。因此,在这种情况下,多个线程将具有对SecurityContext的同一实例的引用。

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

    10-05 22:05