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