Подтвердить что ты не робот

Как узнать текущего пользователя в Spring Boot?

В это Spring приложение для загрузки существует веб-служба, которая возвращает некоторые данные для зарегистрированного пользователя:

@RequestMapping("/resource")
public Map<String, Object> home() {
    Map<String, Object> model = new HashMap<String, Object>();
    model.put("id", UUID.randomUUID().toString());
    model.put("content", "Hello World");
    return model;
}

Представьте, что возвращаемое значение метода зависит от того, какой пользователь в настоящий момент зарегистрирован.

Как узнать, какой пользователь зарегистрирован в этом методе?

4b9b3361

Ответ 1

Согласно запросу:

Spring Boot, который использует Spring Security для внутреннего использования, предоставляет класс SecurityContextHolder, который позволяет искать пользователя, прошедшего проверку подлинности, с помощью:

Authentication auth = SecurityContextHolder.getContext().getAuthentication();

Экземпляр аутентификации теперь предоставляет следующие методы:

  • Получить имя пользователя, вошедшего в систему: getPrincipal()
  • Получите пароль аутентифицированного пользователя: getCredentials()
  • Получите назначенные роли аутентифицированного пользователя: getAuthorities()
  • Получить более подробную информацию о проверенном пользователе: getDetails()

Ответ 2

Вы можете просто использовать HttpServletRequest также для получения пользовательского принципа,

используя запрос HttpServletRequest,

String user=request.getUserPrincipal().getName();

Ответ 3

Начиная с Spring Security 3.2 вы можете войти в систему как пользователь (ваша реализация UserDetails), добавив параметр в метод вашего контроллера:

import org.springframework.security.web.bind.annotation.AuthenticationPrincipal;

@RequestMapping("/resource")
public Map<String, Object> home(@AuthenticationPrincipal User user) {
   ..
}

Замените User именем вашего класса, который реализует интерфейс UserDetails.

Редактирование:

Начиная с Spring Security 4.0 аннотация была перенесена в другой пакет:

import org.springframework.security.core.annotation.AuthenticationPrincipal;

Ответ 4

Один из способов - добавить java.security.Principal в качестве параметра следующим образом:

@RequestMapping("/resource")
public Map<String, Object> home(Principal principal) {
    Map<String, Object> model = new HashMap<String, Object>();
    model.put("id", UUID.randomUUID().toString());
    model.put("content", "Hello " + principal.getName());
    return model;
}

Ответ 5

В последнее время использование сервера аутентификации Keycloak и доступ к текущим вошедшим в систему данным пользователя доступны следующим образом:

String userID;

KeycloakPrincipal kcPrincipal = getPrincipal();
KeycloakSecurityContext ksContext = kcPrincipal.getKeycloakSecurityContext();
IDToken idToken = ksContext.getToken();
userID = idToken.getName();

Ответ 6

Я использую Spring Boot 2.0 с OAuth, поэтому я делаю это так

Authentication auth = SecurityContextHolder.getContext().getAuthentication();
Object pricipal = auth.getPrincipal();
String user="";
if (pricipal instanceof DefaultOidcUser) {
       user = ((DefaultOidcUser) pricipal).getName();
}

Ответ 7

В Spring boot v2.1.9.RELEASE, если вы пытаетесь получить имя, адрес электронной почты, имя_данных, вы можете получить эти данные из Pricipal. Примечание. Я использую Spring Security с Google oauth2

Map<String , Object> userDetails = ((DefaultOidcUser)SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getAttributes(); System.out.println(userDetails.get("name")); System.out.println(userDetails.get("email")); System.out.println(userDetails.get("given_name"));