После обновления Spring Boot 3: аутентификация пользователя вручную не работает

Я обновляю приложение до Spring Boot 3. Мы используем специальную структуру аутентификации, в которой вручную устанавливаем объект аутентификации после аутентификации пользователя.

После входа пользователя в систему мы вызываемSecurityContextHolder.getContext().setAuthentication(authentication);. В предыдущих версиях Spring Boot/Security это работало без проблем. Однако после обновления возвращается AnonymousAuthenticationToken, а не токен, который мы используем и который необходим для аутентификации и авторизации пользователей. Странно то, что при первой проверке аутентификации она содержит правильный токен, но каждый раз, когда я вызываюSecurityContextHolder.getContext().getAuthentication()после этого он возвращает AnonymousAuthenticationToken.

Кто-нибудь испытывал нечто подобное? Это приложение Vaadin, если оно имеет значение.

В весенних документах я нашел следующие советы:

Например, следующий код:SecurityContextHolder.setContext(securityContext);следует заменить наSecurityContextHolder.setContext(securityContext); securityContextRepository.saveContext(securityContext, httpServletRequest, httpServletResponse);

Однако мне это бесполезно, так как это приложение Vaadin, и я сам не обрабатываю никаких запросов.

1 ответ

Из https://docs.spring.io/spring-security/reference/5.8/migration/servlet/session-management.html#_require_explicit_saving_of_securitycontextrepository.

В Spring Security 6 поведение по умолчанию заключается в том, что SecurityContextHolderFilter будет читать SecurityContext только из SecurityContextRepository и заполнять его в SecurityContextHolder. Теперь пользователи должны явно сохранять SecurityContext с помощью SecurityContextRepository, если они хотят, чтобы SecurityContext сохранялся между запросами. Это устраняет неоднозначность и повышает производительность, требуя записи в SecurityContextRepository (т. е. HttpSession) только тогда, когда это необходимо.

Похоже, тебе стоит позвонитьsecurityContextRepository.saveContext(securityContext, httpServletRequest, httpServletResponse);как вы упомянули. В приложении Vaadin вы можете получить запрос и ответ, используяVaadinServletRequest.getCurrent()иVaadinServletResponse.getCurrent()

Другие вопросы по тегам