После обновления 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 ответ
В Spring Security 6 поведение по умолчанию заключается в том, что SecurityContextHolderFilter будет читать SecurityContext только из SecurityContextRepository и заполнять его в SecurityContextHolder. Теперь пользователи должны явно сохранять SecurityContext с помощью SecurityContextRepository, если они хотят, чтобы SecurityContext сохранялся между запросами. Это устраняет неоднозначность и повышает производительность, требуя записи в SecurityContextRepository (т. е. HttpSession) только тогда, когда это необходимо.
Похоже, тебе стоит позвонитьsecurityContextRepository.saveContext(securityContext, httpServletRequest, httpServletResponse);
как вы упомянули. В приложении Vaadin вы можете получить запрос и ответ, используяVaadinServletRequest.getCurrent()
иVaadinServletResponse.getCurrent()