Comment trouver l'utilisateur actuellement connecté dans le démarrage de printemps?

cette application de Botte de printemps il y a un service web, qui renvoie les données d'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 puis-je savoir, quel utilisateur est connecté dans cette méthode?

19
demandé sur DP_ 2015-07-01 13:44:14

6 réponses

demande:

botte à ressort qui utilise Printemps de Sécurité à l'interne offre SecurityContextHolder classe qui permet la recherche de l'utilisateur actuellement authentifié via:

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

authentification exemple fournit les méthodes suivantes:

  • Obtenir le nom d'utilisateur de l'utilisateur connecté: getPrincipal()
  • Obtenir le mot de passe de l'utilisateur authentifié: getCredentials()
  • Obtenir les rôles de l'utilisateur authentifié: getAuthorities()
  • Obtenir plus de détails de l'utilisateur authentifié: getDetails()
59
répondu Roman Vottner 2018-03-21 09:15:44

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

utilisant la requête HttpServletRequest,

String user=request.getUserPrincipal().getName();
4
répondu nik 2017-09-13 11:38:42

Une façon est d'ajouter java.sécurité.Principal comme 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;
}
2
répondu Developer Davo 2017-11-28 07:34:19

depuis le printemps sécurité 4.0, vous pouvez être actuellement connecté à l'utilisateur (votre implémentation de UserDetails) en ajoutant un paramètre à l'intérieur de votre méthode de controller:

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

Remplacer User avec le nom de votre classe qui implémente UserDetails interface.

2
répondu NikolaB 2018-08-21 07:56:25

utilisation récente du serveur D'authentification Keycloak et accès aux données utilisateur actuellement connectés est accessible comme ceci

String userID;

KeycloakPrincipal kcPrincipal = getPrincipal();
KeycloakSecurityContext ksContext = kcPrincipal.getKeycloakSecurityContext();
IDToken idToken = ksContext.getToken();
userID = idToken.getName();
1
répondu Petko Mirchev 2018-09-06 19:05:10

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
répondu Petko Mirchev 2018-05-02 11:40:25