Spring Security: vérifier si un utilisateur a un rôle dans Java

1. Introduction

Dans Spring Security, il est parfois nécessaire de vérifier si un utilisateur authentifié a un rôle spécifique. Cela peut être utile pour activer ou désactiver des fonctionnalités particulières dans nos applications .

Dans ce didacticiel, nous verrons différentes façons de vérifier les rôles des utilisateurs dans Java pour Spring Security.

2. Vérification du rôle de l'utilisateur dans Java

Spring Security propose plusieurs façons de vérifier les rôles des utilisateurs dans le code Java . Nous examinerons chacun d'entre eux ci-dessous.

2.1. @PreAuthorize

La première façon de vérifier les rôles utilisateur dans Java consiste à utiliser l' annotation @PreAuthorize fournie par Spring Security. Cette annotation peut être appliquée à une classe ou à une méthode et accepte une seule valeur de chaîne qui représente une expression SpEL.

Avant de pouvoir utiliser cette annotation, nous devons d'abord activer la sécurité de la méthode globale. Cela peut être fait dans le code Java en ajoutant l' annotation @EnableGlobalMethodSecurity à n'importe quelle classe de configuration.

Ensuite, Spring Security fournit deux expressions que nous pouvons utiliser avec l' annotation @PreAuthorize pour vérifier les rôles des utilisateurs:

@PreAuthorize("hasRole('ROLE_ADMIN')") @GetMapping("/user/{id}") public String getUser(@PathVariable("id") String id) { ... }

Nous pouvons également vérifier plusieurs rôles dans une seule expression:

@PreAuthorize("hasAnyRole('ROLE_ADMIN','ROLE_MANAGER')") @GetMapping("/users") public String getUsers() { ... }

Dans ce cas, la demande sera autorisée si l'utilisateur possède l' un des rôles spécifiés.

Si la méthode est appelée sans avoir le rôle approprié, Spring Security lève une exception et redirige vers la page d'erreur.

2.2. SecurityContext

La prochaine façon dont nous pouvons vérifier les rôles utilisateur dans le code Java consiste à utiliser la classe SecurityContext .

Par défaut, Spring Security utilise une copie locale du thread de cette classe. Cela signifie que chaque demande dans notre application a son contexte de sécurité qui contient les détails de l'utilisateur qui fait la demande .

Pour l'utiliser, nous appelons simplement les méthodes statiques dans SecurityContextHolder :

Authentication auth = SecurityContextHolder.getContext().getAuthentication(); if (auth != null && auth.getAuthorities().stream().anyMatch(a -> a.getAuthority().equals("ADMIN"))) { ... }

Notez que nous utilisons ici le nom d'autorité simple au lieu du nom complet du rôle.

Cela fonctionne bien lorsque nous avons besoin de vérifications plus fines - par exemple, une partie spécifique d'une seule méthode. Cependant, cette approche ne fonctionnera pas si nous utilisons le mode de support de contexte global dans Spring Security .

2.3. UserDetailsService

La troisième façon dont nous pouvons rechercher les rôles utilisateur dans le code Java consiste à utiliser UserDetailsService . C'est un bean que nous pouvons injecter n'importe où dans notre application et l'appeler selon les besoins:

@GetMapping("/users") public String getUsers() { UserDetails details = userDetailsService.loadUserByUsername("mike"); if (details != null && details.getAuthorities().stream() .anyMatch(a -> a.getAuthority().equals("ADMIN"))) { // ... } }

Encore une fois, nous devons utiliser le nom de l'autorité ici, pas le nom complet du rôle avec le préfixe.

L'avantage de cette approche est que nous pouvons vérifier les rôles de n'importe quel utilisateur , pas seulement celui qui a fait la demande.

2.4. Demande de servlet

Si nous utilisons Spring MVC, nous pouvons également vérifier les rôles des utilisateurs dans Java à l'aide de la classe HttpServletRequest :

@GetMapping("/users") public String getUsers(HttpServletRequest request) { if (request.isUserInRole("ROLE_ADMIN")) { ... } }

3. Conclusion

Dans cet article, nous avons vu plusieurs façons différentes de vérifier les rôles à l'aide du code Java avec Spring Security.

Comme toujours, les exemples de code de cet article sont disponibles à l'adresse over sur GitHub.