Spring Security: controleer of een gebruiker een rol heeft in Java

1. Inleiding

In Spring Security is het soms nodig om te controleren of een geauthenticeerde gebruiker een specifieke rol heeft. Dit kan handig zijn om bepaalde functies in onze applicaties in of uit te schakelen.

In deze zelfstudie zien we verschillende manieren om gebruikersrollen in Java voor Spring Security te controleren.

2. Gebruikersrol in Java controleren

Spring Security biedt verschillende manieren om gebruikersrollen in Java-code te controleren. We zullen ze hieronder allemaal bekijken.

2.1. @PreAuthorize

De eerste manier om te controleren op gebruikersrollen in Java is door de @PreAuthorize annotatie geleverd door Spring Security. Deze annotatie kan worden toegepast op een klasse of methode en accepteert een enkele tekenreekswaarde die een SpEL-expressie vertegenwoordigt.

Voordat we deze annotatie kunnen gebruiken, moeten we eerst globale methodebeveiliging inschakelen. Dit kan in Java-code worden gedaan door de extensie @EnableGlobalMethodSecurity annotatie naar een willekeurige configuratieklasse.

Vervolgens biedt Spring Security twee uitdrukkingen die we kunnen gebruiken met de @PreAuthorize annotatie om gebruikersrollen te controleren:

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

We kunnen ook meerdere rollen in een enkele uitdrukking controleren:

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

In dit geval is het verzoek toegestaan ​​als de gebruiker dat heeft gedaan ieder van de gespecificeerde rollen.

Als de methode wordt aangeroepen zonder de juiste rol te hebben, genereert Spring Security een uitzondering en wordt deze omgeleid naar de foutpagina.

2.2. SecurityContext

De volgende manier waarop we kunnen controleren op gebruikersrollen in Java-code is met de SecurityContext klasse.

Spring Security gebruikt standaard een thread-local kopie van deze klasse. Dit betekent elk verzoek in onze applicatie heeft zijn beveiligingscontext die details bevat van de gebruiker die het verzoek indient.

Om het te gebruiken, bellen we eenvoudig de statische methoden in SecurityContextHolder:

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

Merk op dat we hier de gewone naam van de autoriteit gebruiken in plaats van de volledige naam van de rol.

Dit werkt goed als we meer fijnmazige controles nodig hebben, bijvoorbeeld een specifiek deel van een enkele methode. Echter, deze benadering zal niet werken als we de modus voor globale contexthouder gebruiken in Spring Security.

2.3. UserDetailsService

De derde manier waarop we gebruikersrollen in Java-code kunnen opzoeken, is door de UserDetailsService. Dit is een boon die we overal in onze applicatie kunnen injecteren en deze naar behoefte kunnen noemen:

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

Nogmaals, we moeten hier de naam van de autoriteit gebruiken, niet de volledige naam van de rol met voorvoegsel.

Het voordeel van deze aanpak is dat we de rollen voor elke gebruiker kunnen controleren, niet alleen degene die het verzoek heeft gedaan.

2.4. Servlet-verzoek

Als we Spring MVC gebruiken, kunnen we ook gebruikersrollen in Java controleren met de HttpServletRequest klasse:

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

3. Conclusie

In dit artikel hebben we verschillende manieren gezien om te controleren op rollen met behulp van Java-code met Spring Security.

Zoals altijd zijn de codevoorbeelden uit dit artikel te vinden op GitHub.