Spring Security: один и тот же экземпляр SecurityContext в нескольких ThreadLocals, как это работает? - PullRequest
4 голосов
/ 16 июня 2011

У меня есть несколько вопросов о Spring Security 3.0.5 и SecurityContext. Прежде всего, я попытаюсь сделать вывод, что я знаю:

  • SecurityContextХолдер хранит SecurityContext
  • Между запросами, SecurityContext хранится в HttpSession
  • Начало запроса: SecurityContextHolder получает SecurityContext от HttpSession
  • Конец запроса: SecurityContextHolder помещает SecurityContext в HttpSession

  • Во время запроса на сервере SecurityContextHolder использует ThreadLocal. Везде в приложении (один и тот же запрос) к SecurityContext можно получить доступ

Теперь мой вопрос ....

-> Два запроса: экземпляр SecurityContext будет совместно использоваться

Как это работает? Я имею в виду, что SecurityContextHolder использует ThreadLocal для каждого запроса. 2 запроса = 2 ThreadLocals

Каждый запрос выполняет: getSessionAttribute (SecurityContext) из HttpSession Что произойдет, если они будут работать с SecurityContext? Изменен ли SecurityContext во всех ThreadLocals?

Насколько я знаю: да (??)

Как это работает? Как они могут работать на одном экземпляре? Я имею в виду, я действительно не могу представить, как два разных потока с двумя разными ThreadLocals могут работать на одном экземпляре?

API (ThreadLocal): Этот класс предоставляет локальные переменные потока. Эти переменные отличаются от своих обычных аналогов тем, что каждый поток, который обращается к одному (через свой метод get или set), имеет свою собственную, независимо инициализированную копию переменной.

Я имею в виду, вот оно: копировать! может быть, я ошибаюсь, и невозможно, чтобы два потока работали на одном и том же SecurityContext? Но Spring Security Documentation говорит об этом!

Было бы здорово, если бы кто-то мог мне это объяснить :-) Спасибо!

1 Ответ

2 голосов
/ 16 июня 2011

Каждый поток имеет свое собственное значение ThreadLocal, но ничто не мешает этим значениям быть равными.Таким образом, в этом случае несколько потоков будут иметь ссылки на один и тот же экземпляр SecurityContext.

Обычно это не проблема, но если вы хотите изменить контекст безопасности, вы можете включить защитное копирование, см. SEC-356 .

...