Récupérer les informations utilisateur dans Spring Security

1. Vue d'ensemble

Cet article montre comment récupérer les détails de l'utilisateur dans Spring Security .

L'utilisateur actuellement authentifié est disponible via un certain nombre de mécanismes différents dans Spring - voyons d'abord la solution la plus courante - l'accès par programme.

2. Obtenez l'utilisateur dans un bean

Le moyen le plus simple de récupérer le principal actuellement authentifié consiste à effectuer un appel statique au SecurityContextHolder :

Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); String currentPrincipalName = authentication.getName();

Une amélioration de cet extrait de code consiste d'abord à vérifier s'il existe un utilisateur authentifié avant d'essayer d'y accéder:

Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); if (!(authentication instanceof AnonymousAuthenticationToken)) { String currentUserName = authentication.getName(); return currentUserName; }

Il y a bien sûr des inconvénients à avoir un appel statique comme celui-ci - une diminution de la testabilité du code étant l'un des plus évidents. Au lieu de cela, nous explorerons des solutions alternatives pour cette exigence très courante.

3. Obtenez l'utilisateur dans un contrôleur

Dans un bean annoté @Controller , il existe des options supplémentaires. Le principal peut être défini directement comme argument de méthode et il sera correctement résolu par le framework:

@Controller public class SecurityController { @RequestMapping(value = "/username", method = RequestMethod.GET) @ResponseBody public String currentUserName(Principal principal) { return principal.getName(); } }

Alternativement, nous pouvons également utiliser le jeton d'authentification :

@Controller public class SecurityController { @RequestMapping(value = "/username", method = RequestMethod.GET) @ResponseBody public String currentUserName(Authentication authentication) { return authentication.getName(); } }

L'API de la classe Authentication est très ouverte afin que le framework reste le plus flexible possible. Pour cette raison, le principal Spring Security ne peut être récupéré qu'en tant qu'objet et doit être converti en l' instance UserDetails correcte :

UserDetails userDetails = (UserDetails) authentication.getPrincipal(); System.out.println("User has authorities: " + userDetails.getAuthorities());

Et enfin, directement depuis la requête HTTP :

@Controller public class GetUserWithHTTPServletRequestController { @RequestMapping(value = "/username", method = RequestMethod.GET) @ResponseBody public String currentUserNameSimple(HttpServletRequest request) { Principal principal = request.getUserPrincipal(); return principal.getName(); } }

4. Obtenez l'utilisateur via une interface personnalisée

Pour tirer pleinement parti de l'injection de dépendances Spring et pouvoir récupérer l'authentification partout, pas seulement dans les beans @Controller , nous devons masquer l'accès statique derrière une simple façade:

public interface IAuthenticationFacade { Authentication getAuthentication(); } @Component public class AuthenticationFacade implements IAuthenticationFacade { @Override public Authentication getAuthentication() { return SecurityContextHolder.getContext().getAuthentication(); } }

La façade expose l' objet Authentication tout en masquant l'état statique et en gardant le code découplé et entièrement testable:

@Controller public class GetUserWithCustomInterfaceController { @Autowired private IAuthenticationFacade authenticationFacade; @RequestMapping(value = "/username", method = RequestMethod.GET) @ResponseBody public String currentUserNameSimple() { Authentication authentication = authenticationFacade.getAuthentication(); return authentication.getName(); } }

5. Obtenez l'utilisateur dans JSP

Le principal actuellement authentifié est également accessible dans les pages JSP , en tirant parti de la prise en charge de spring security taglib. Tout d'abord, nous devons définir la balise dans la page:

Ensuite, nous pouvons nous référer au principal :

 authenticated as  

6. Obtenez l'utilisateur dans Thymeleaf

Thymeleaf est un moteur de création de modèles Web moderne côté serveur, avec une bonne intégration avec le framework Spring MVC. Voyons comment accéder au principal actuellement authentifié dans une page avec le moteur Thymeleaf.

Tout d'abord, nous devons ajouter les dépendances thymeleaf-spring5 et thymeleaf-extras-springsecurity5 pour intégrer Thymeleaf à Spring Security:

 org.thymeleaf.extras thymeleaf-extras-springsecurity5   org.thymeleaf thymeleaf-spring5 

Nous pouvons maintenant faire référence au principal dans la page HTML en utilisant l' attribut sec: authorize :

 Authenticated as 

7. Conclusion

Cet article a montré comment obtenir les informations utilisateur dans une application Spring, en commençant par le mécanisme d'accès statique commun, suivi de plusieurs meilleures façons d'injecter le principal.

L'implémentation de ces exemples peut être trouvée dans le projet GitHub - il s'agit d'un projet basé sur Eclipse, il devrait donc être facile à importer et à exécuter tel quel. Lorsque le projet s'exécute localement, le HTML de la page d'accueil est accessible à l'adresse:

//localhost:8080/spring-security-rest-custom/foos/1