Spring Security: Sjekk om en bruker har en rolle i Java

1. Introduksjon

I vårsikkerhet er det noen ganger nødvendig å sjekke om en godkjent bruker har en bestemt rolle. Dette kan være nyttig for å aktivere eller deaktivere bestemte funksjoner i applikasjonene våre.

I denne opplæringen ser vi forskjellige måter å sjekke brukerroller på Java for Spring Security.

2. Kontrollere brukerrolle i Java

Spring Security gir flere måter å sjekke brukerroller i Java-kode på. Vi ser på hver av dem nedenfor.

2.1. @PreAuthorize

Den første måten å sjekke for brukerroller i Java er å bruke @PreAuthorize kommentar levert av Spring Security. Denne merknaden kan brukes på en klasse eller metode, og den aksepterer en enkelt strengverdi som representerer et SPEL-uttrykk.

Før vi kan bruke denne merknaden, må vi først aktivere global metodesikkerhet. Dette kan gjøres i Java-kode ved å legge til @EnableGlobalMethodSecurity kommentar til enhver konfigurasjonsklasse.

Deretter gir Spring Security to uttrykk vi kan bruke med @PreAuthorize kommentar for å sjekke brukerroller:

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

Vi kan også sjekke flere roller i ett uttrykk:

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

I dette tilfellet vil forespørselen være tillatt hvis brukeren har det noen av de angitte rollene.

Hvis metoden kalles uten å ha riktig rolle, kaster Spring Security et unntak og omdirigerer til feilsiden.

2.2. SecurityContext

Den neste måten vi kan sjekke for brukerroller i Java-kode er med SecurityContext klasse.

Som standard bruker Spring Security en tråd-lokal kopi av denne klassen. Dette betyr hver forespørsel i applikasjonen vår har sin sikkerhetskontekst som inneholder detaljer om brukeren som gjør forespørselen.

For å bruke det, kaller vi bare de statiske metodene inn SecurityContextHolder:

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

Merk at vi bruker det vanlige autoritetsnavnet her i stedet for det fulle rollenavnet.

Dette fungerer bra når vi trenger flere finkornede sjekker - for eksempel en bestemt del av en enkelt metode. Derimot, denne tilnærmingen vil ikke fungere hvis vi bruker den globale kontekstholdermodusen i Spring Security.

2.3. UserDetailsService

Den tredje måten vi kan slå opp brukerroller i Java-kode er ved å bruke UserDetailsService. Dette er en bønne vi kan injisere hvor som helst i applikasjonen vår og kalle den etter behov:

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

Igjen, vi må bruke autoritetsnavnet her, ikke det fulle rollenavnet med prefikset.

Fordelen med denne tilnærmingen er at vi kan sjekke roller for alle brukere, ikke bare den som kom med forespørselen.

2.4. Servletforespørsel

Hvis vi bruker Spring MVC, kan vi også sjekke brukerroller i Java ved hjelp av HttpServletRequest klasse:

@GetMapping ("/ brukere") offentlige String getUsers (HttpServletRequest-forespørsel) {if (request.isUserInRole ("ROLE_ADMIN")) {...}}

3. Konklusjon

I denne artikkelen har vi sett flere forskjellige måter å se etter roller ved hjelp av Java-kode med Spring Security.

Som alltid kan kodeeksemplene fra denne artikkelen finnes på GitHub.


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