Spring Security дает нулевую аутентификацию при получении имени пользователя в Spring Boot - PullRequest
0 голосов
/ 02 октября 2018

Я пытаюсь получить имя пользователя следующим образом:

public static String getUsername() {
    SecurityContext context = SecurityContextHolder.getContext();
    UserDetails userDetails = (UserDetails) context.getAuthentication().getPrincipal();
    return userDetails.getUsername();
}

Работает нормально, только когда залогинен, но при переходе на другую страницу контекст становится org.springframework.security.core.context.SecurityContextImpl@ffffffff: Null authentication с authentification = null.

Как правильно восстановить зарегистрированного пользователя с помощью Spring Security в Spring Boot?

Версия Spring Boot 2.0.3.RELEASE.

UPD:
Чтобы уточнить: после перехода на другую страницу SecurityContextHolder.getContext() дает контекст с authentification = null.Так что context.getAuthentication().getPrincipal() бросает NullPointerException, потому что context.getAuthentication() равно нулю.

1 Ответ

0 голосов
/ 02 октября 2018

Не знаю, что не так, но я нашел обходной путь - я сохраняю имя пользователя в сеансе.Поскольку я использую Vaadin - я использую VaadinSession, но я считаю, что HttpSession также может быть использован.

public static String getUsername() {
  VaadinSession session = VaadinSession.getCurrent();
  if(session.getAttribute("username") == null) {
    SecurityContext context = SecurityContextHolder.getContext();
    UserDetails userDetails = (UserDetails) context.getAuthentication().getPrincipal();
    session.setAttribute("username", userDetails.getUsername());
  }
  return (String) session.getAttribute("username");
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...