Объект аутентификации не был найден в SecurityContext
- У меня есть приложение, экспортирующее веб-сервисы, с настроенным Spring Security
SecurityFilterChain
(сSecurityContextPersistenceFilter
среди прочих, что требуется для отдыха). - Мое приложение также использует Spring Security для защиты вызовов методов.
У меня есть следующая ошибка, когда метод безопасности срабатывает:
org.springframework.security.authentication.AuthenticationCredentialsNotFoundException: An Authentication object was not found in the SecurityContext
Вторая часть требует Authentication
в SecurityContextHolder
как показано в org.springframework.security.access.intercept.AbstractSecurityInterceptor
(строка 195):
SecurityContextHolder.getContext().getAuthentication();
Но, SecurityContextPersistenceFilter
удаляет его перед вызовом метода, как показано в org.springframework.security.web.context.SecurityContextPersistenceFilter
(строка 84)
SecurityContextHolder.clearContext();
Что я могу сделать, чтобы этот объект SecurityContextHolder
когда вызывается метод?
Заранее спасибо.
Я использую Spring Security 3.0.8-RELEASE
2 ответа
ОК, мое приложение размещено поверх Apache CXF DOSGi 1.4 для генерации конечных точек REST. Перехватчики Apache CXF вызывают неожиданное поведение и SecurityContextHolder.clearContext()
вызывается до завершения обработки запроса.
Более подробную информацию об этой ошибке можно найти здесь.
SecurityContextHolder.clearContext()
будет вызываться только после завершения обработки запроса. Таким образом, обычно весь логический код вашего приложения будет выполняться перед этой строкой, и нет никаких проблем. Но проблема может присутствовать, если вы выполняете какой-то новый поток в своем коде (по умолчанию контекст безопасности не будет распространяться). Если это ваш случай, вы можете попытаться принудительно распространить контекстное содержимое на дочерний поток. Если вы используете только один поток, убедитесь, что весь ваш код покрыт цепочкой фильтров безопасности Spring (может быть, у вас есть какой-то специальный фильтр, который выполняется вокруг цепочки фильтров безопасности пружины?).