web-dev-qa-db-fra.com

Comment connaître l'utilisateur actuellement connecté dans Spring Boot?

Dans cette application Spring Boot , il existe un service Web qui renvoie des données pour un utilisateur connecté:

@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;
}

Imaginez, la valeur de retour de la méthode dépend de l'utilisateur actuellement connecté.

Comment savoir quel utilisateur est connecté à cette méthode?

26
DP_

Tel que demandé:

Spring Boot qui utilise Spring Security en interne fournit un SecurityContextHolder class qui permet de rechercher l'utilisateur actuellement authentifié via:

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

Le authentication instance fournit maintenant les méthodes suivantes:

  • Obtenez le nom d'utilisateur de l'utilisateur connecté: getPrincipal()
  • Obtenez le mot de passe de l'utilisateur authentifié: getCredentials()
  • Obtenez les rôles attribués à l'utilisateur authentifié: getAuthorities()
  • Obtenez plus de détails sur l'utilisateur authentifié: getDetails()
69
Roman Vottner

Vous pouvez simplement utiliser HttpServletRequest également pour obtenir le principe de l'utilisateur,

en utilisant la requête HttpServletRequest,

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

Une solution consiste à ajouter Java.security.Principal en tant que paramètre, comme suit:

@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;
}
4
Developer Davo

Depuis Spring Security 4.0, vous pouvez obtenir un utilisateur actuellement connecté (votre implémentation de UserDetails) en ajoutant un paramètre dans votre méthode de contrôleur:

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

Remplacez User par le nom de votre classe qui implémente l'interface UserDetails.

4
NikolaB

Récemment, l’utilisation du serveur d’authentification Keycloak et l’accès aux données des utilisateurs actuellement connectés est accessible comme ceci

String userID;

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

J'utilise Spring Boot 2.0 avec OAuth, donc je le fais comme ça 

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