Spring Security: один и тот же экземпляр SecurityContext в нескольких ThreadLocals, как это работает?


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

  • SecurityContextHolder хранит 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? Но в документации по безопасности весны так сказано!

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

1 4

1 ответ:

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

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