Spring SecurityContext теряется

Я работаю над устаревшим приложением (Spring 2.2.5, Spring Security 2.0.8). Аутентификация достигается с помощью настраиваемого PreAuthenticationProcessingFilter, где SecurityContext заполняется объектом Authentication. Эта проверка подлинности доступна в большинстве мест (будь то прямой вызов SecurityContextHolder или аргументы AccessDecisionManager/AfterInvocationProvider). Однако есть места, где объект аутентификации (доступный через SecurityContextHolder) имеет значение null. Что действительно странно, так это то, что это происходит в рамках одного запроса Http. Класс A получает объект аутентификации, класс B, вызываемый позже в стеке, получает значение null. Естественно, это происходит внутри одного и того же потока, что исключает простейший ответ на эту проблему. Похоже, что несмотря на то, что поток является одним и тем же SecurityContextHolder, он возвращает разные объекты SecurityContext (SecurityContext.toString() возвращает разные адреса памяти). Важно то, что место, где это происходит, не является вашим обычным компонентом Spring. Это довольно настраиваемая модульная подсистема с задействованным загрузчиком классов, и я думаю, что это должно что-то делать с этим странным эффектом.

Итак, вопрос: что, помимо создания другого потока, может привести к тому, что SecurityContextHolder «потеряет» объект SecurityContext?


person Jacek Prucia    schedule 19.09.2013    source источник


Ответы (1)


Ключевой проблемой здесь был SecurityContextHolder, использующий ThreadLocal, и моя подсистема, использующая собственный загрузчик классов. SecurityContextHolder, вызванный в классе, созданном настраиваемым загрузчиком классов, заставит этот загрузчик классов загрузить класс SecurityContextHolder и инициализировать его с пустым контекстом, отсюда и эффект, описанный выше.

Короче говоря, ThreadLocal и пользовательские загрузчики классов плохо сочетаются, как описано здесь:

Эффект ThreadLocals и параллельной загрузки классов

person Jacek Prucia    schedule 23.09.2013