Spring Security - пользовательская аутентификация без провайдера? - PullRequest
0 голосов
/ 10 июля 2020

У меня есть гибридное приложение, которое использует Spring Security для проверки ролей, но не для входа в систему. Ошибка PreAuthorize с сообщением «Объект аутентификации не найден в SecurityContext»

Я попытался добавить это в свой контроллер входа в систему, но, похоже, он не работает:

SecurityContextHolder.getContext().setAuthentication(makeAuthentication(op));

Конфигурация следующим образом:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebConfig extends WebSecurityConfigurerAdapter {}

Я вынужден использовать поставщика аутентификации? Как это будет работать в этом случае? Роли пользователей хранятся в объекте Operator.

EDIT: похоже, что SecurityContext очищается между запросами. Как сделать его постоянным? Я попытался добавить контекст безопасности к сеансу как атрибут SPRING_SECURITY_CONTEXT_KEY, но все равно не повезло. В конце концов, я заставил это работать, восстановив контекст в перехватчике. Не уверен, что это лучший способ.

1 Ответ

0 голосов
/ 13 июля 2020
  1. Убедитесь, что ваш клиент отправляет последующие запросы в том же сеансе, что и ваш пользовательский запрос входа

  2. Если это гарантировано, проверьте, идет ли ваш пользовательский URL-адрес входа через весеннюю безопасность, но как незащищенный URL. Если это не так, вы должны добавить следующее к своему пользовательскому этапу успешного входа.

    SecurityContextHolder.getContext().setAuthentication(makeAuthentication(op));
    HttpSession session = req.getSession(true);
    session.setAttribute(SPRING_SECURITY_CONTEXT_KEY, 
    SecurityContextHolder.getContext()); 
Как только эти шаги будут выполнены, Spring Security SecurityContextPersistenceFilter обеспечит заполнение SecurityContextHolder.getContext() при последующих запросах.
...