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?
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()
Vous pouvez simplement utiliser HttpServletRequest pour obtenir le principe de l'utilisateur,
utilisant la requête HttpServletRequest,
String user=request.getUserPrincipal().getName();
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;
}
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.
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();
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();
}