Spring Security: controlla se un utente ha un ruolo in Java

1. Introduzione

In Spring Security, a volte è necessario verificare se un utente autenticato ha un ruolo specifico. Questo può essere utile per abilitare o disabilitare particolari funzionalità nelle nostre applicazioni .

In questo tutorial, vedremo vari modi per controllare i ruoli utente in Java per Spring Security.

2. Verifica del ruolo utente in Java

Spring Security offre diversi modi per controllare i ruoli utente nel codice Java . Vedremo ciascuno di loro di seguito.

2.1. @PreAuthorize

Il primo modo per verificare i ruoli utente in Java è utilizzare l' annotazione @PreAuthorize fornita da Spring Security. Questa annotazione può essere applicata a una classe oa un metodo e accetta un singolo valore di stringa che rappresenta un'espressione SpEL.

Prima di poter utilizzare questa annotazione, dobbiamo prima abilitare la sicurezza del metodo globale. Questa operazione può essere eseguita nel codice Java aggiungendo l' annotazione @EnableGlobalMethodSecurity a qualsiasi classe di configurazione.

Quindi, Spring Security fornisce due espressioni che possiamo utilizzare con l' annotazione @PreAuthorize per controllare i ruoli degli utenti:

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

Possiamo anche controllare più ruoli in una singola espressione:

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

In questo caso, la richiesta sarà consentita se l'utente ha uno dei ruoli specificati.

Se il metodo viene chiamato senza avere il ruolo appropriato, Spring Security genera un'eccezione e reindirizza alla pagina di errore.

2.2. SecurityContext

Il modo successivo in cui possiamo verificare i ruoli utente nel codice Java è con la classe SecurityContext .

Per impostazione predefinita, Spring Security utilizza una copia locale del thread di questa classe. Ciò significa che ogni richiesta nella nostra applicazione ha il proprio contesto di sicurezza che contiene i dettagli dell'utente che effettua la richiesta .

Per usarlo, chiamiamo semplicemente i metodi statici in SecurityContextHolder :

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

Nota che qui stiamo usando il semplice nome dell'autorità invece del nome completo del ruolo.

Funziona bene quando abbiamo bisogno di controlli più dettagliati, ad esempio una parte specifica di un singolo metodo. Tuttavia, questo approccio non funzionerà se utilizziamo la modalità titolare del contesto globale in Spring Security .

2.3. UserDetailsService

Il terzo modo in cui possiamo cercare i ruoli utente nel codice Java è utilizzare UserDetailsService . Questo è un bean che possiamo iniettare ovunque nella nostra applicazione e chiamarlo secondo necessità:

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

Anche in questo caso, dobbiamo utilizzare il nome dell'autorità qui, non il nome completo del ruolo con prefisso.

Il vantaggio di questo approccio è che possiamo controllare i ruoli per qualsiasi utente , non solo per quello che ha effettuato la richiesta.

2.4. Richiesta servlet

Se stiamo usando Spring MVC, possiamo anche controllare i ruoli utente in Java usando la classe HttpServletRequest :

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

3. Conclusione

In questo articolo, abbiamo visto diversi modi per verificare i ruoli utilizzando il codice Java con Spring Security.

Come sempre, gli esempi di codice di questo articolo possono essere trovati su GitHub.