Spring Security: Kontroller, om en bruger har en rolle i Java

1. Introduktion

I Spring Security er det undertiden nødvendigt at kontrollere, om en godkendt bruger har en bestemt rolle. Dette kan være nyttigt for at aktivere eller deaktivere bestemte funktioner i vores applikationer.

I denne vejledning ser vi forskellige måder at kontrollere brugerroller i Java for Spring Security.

2. Kontrol af brugerrolle i Java

Spring Security giver flere måder at kontrollere brugerroller i Java-kode på. Vi ser på hver af dem nedenfor.

2.1. @PreAuthorize

Den første måde at kontrollere brugerroller på Java er at bruge @PreAuthorize kommentar leveret af Spring Security. Denne kommentar kan anvendes på en klasse eller metode, og den accepterer en enkelt strengværdi, der repræsenterer et SpEL-udtryk.

Før vi kan bruge denne kommentar, skal vi først aktivere global metodesikkerhed. Dette kan gøres i Java-kode ved at tilføje @EnableGlobalMethodSecurity kommentar til enhver konfigurationsklasse.

Derefter giver Spring Security to udtryk, vi kan bruge sammen med @PreAuthorize kommentar for at kontrollere brugerroller:

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

Vi kan også kontrollere flere roller i et enkelt udtryk:

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

I dette tilfælde vil anmodningen blive tilladt, hvis brugeren har gjort det nogen af de angivne roller.

Hvis metoden kaldes uden at have den rette rolle, kaster Spring Security en undtagelse og omdirigerer til fejlsiden.

2.2. Sikkerhedskontekst

Den næste måde, vi kan tjekke for brugerroller i Java-kode er med Sikkerhedskontekst klasse.

Som standard bruger Spring Security en tråd-lokal kopi af denne klasse. Det betyder hver anmodning i vores applikation har sin sikkerhedskontekst, der indeholder detaljer om den bruger, der fremsætter anmodningen.

For at bruge det kalder vi blot de statiske metoder ind SecurityContextHolder:

Authentication auth = SecurityContextHolder.getContext (). GetAuthentication (); hvis (auth! = null && auth.getAuthorities (). stream (). anyMatch (a -> a.getAuthority (). er lig med ("ADMIN"))) {...}

Bemærk, at vi bruger det almindelige myndighedsnavn her i stedet for det fulde rollenavn.

Dette fungerer godt, når vi har brug for flere finkornede kontroller - for eksempel en bestemt del af en enkelt metode. Imidlertid, denne tilgang fungerer ikke, hvis vi bruger den globale kontekstholdertilstand i Spring Security.

2.3. UserDetailsService

Den tredje måde, vi kan slå op på brugerroller i Java-kode er ved hjælp af UserDetailsService. Dette er en bønne, vi kan injicere hvor som helst i vores ansøgning og kalde den efter behov:

@GetMapping ("/ brugere") offentlige String getUsers () {UserDetails detaljer = userDetailsService.loadUserByUsername ("mike"); hvis (detaljer! = null && detaljer.getAuthorities (). stream () .anyMatch (a -> a.getAuthority (). er lig med ("ADMIN"))) {// ...}}

Igen skal vi bruge autoritetsnavnet her, ikke det fulde rollenavn med præfiks.

Fordelen ved denne tilgang er, at vi kan kontrollere roller for enhver bruger, ikke kun den, der fremsatte anmodningen.

2.4. Servlet-anmodning

Hvis vi bruger Spring MVC, kan vi også kontrollere brugerroller i Java ved hjælp af HttpServletRequest klasse:

@GetMapping ("/ brugere") offentlige String getUsers (HttpServletRequest anmodning) {if (request.isUserInRole ("ROLE_ADMIN")) {...}}

3. Konklusion

I denne artikel har vi set flere forskellige måder at kontrollere roller ved hjælp af Java-kode med Spring Security.

Som altid kan kodeeksemplerne fra denne artikel findes på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found