3

Я вижу странное поведение при использовании аутентификации на основе токена на основе аутентификации в API для отдыха, написанном с использованием Spring Boot.Является ли SecurityContext разделяемым между запросами при использовании Spring Security?

клиент включает в себя маркер JWT с каждым запросом, а также пользовательский фильтр я написал, что расширяет GenericFilterBean добавляет объект проверки подлинности на основе требований в маркер контекста безопасности, используя следующее:

SecurityContextHolder.getContext().setAuthentication(authentication); 

и очищает контекст после обработки запроса, выполнив:

SecurityContextHolder.getContext().setAuthentication(null); 

Однако когда простое приложение, которое я разработал выполняет ряд операций, я иногда вижу, что контекст безопасности не установлен правильно - иногда это ноль для запроса, который предоставил токен. Фильтр вызывается правильно, также вызывается setAuthencation(), но запрос не выполняет аутентификацию и выдает отказ 403.

Если я отключу любое управление сеансами http, установив политику создания сеанса STATELESS, это поведение прекратится.

Любые идеи, что может быть здесь? Является ли контекст безопасности совместно использоваться потоками, связанными с запросами?

+0

Вы проверили это? http://stackoverflow.com/questions/16952718/springs-securitycontextholder-getcontext-getauthentication-returns-null-aft – randominstanceOfLivingThing

ответ

0

кажется, что контекст может быть разделен, согласно официальной документации здесь: http://docs.spring.io/spring-security/site/docs/3.1.x/reference/springsecurity-single.html

В приложении, которое принимает параллельные запросы в одной сессии, то же SecurityContext экземпляр будет разделен между потоками. Несмотря на то, что используется ThreadLocal, это тот же самый экземпляр, который извлекается из HttpSession для каждого потока. Это имеет последствия, если вы хотите временно изменить контекст, в котором работает поток. Если вы просто используете SecurityContextHolder.getContext() и вызываете setAuthentication (anAuthentication) в возвращаемом объекте контекста, то объект аутентификации будет изменяться во всех параллельных потоках, которые используют один и тот же экземпляр SecurityContext. Вы можете настроить поведение SecurityContextPersistenceFilter, чтобы создать абсолютно новый SecurityContext для каждого запроса, не позволяя изменениям в одном потоке влиять на другой. В качестве альтернативы вы можете создать новый экземпляр только в том месте, где вы временно меняете контекст. Метод SecurityContextHolder.createEmptyContext() всегда возвращает новый экземпляр контекста.

 Смежные вопросы

  • Нет связанных вопросов^_^