Proljetna sigurnost: Provjerite ima li korisnik ulogu u Javi

1. Uvod

U sustavu Spring Security ponekad je potrebno provjeriti ima li provjereni korisnik određenu ulogu. To može biti korisno za omogućavanje ili onemogućavanje određenih značajki u našim aplikacijama.

U ovom uputstvu vidjet ćemo razne načine provjere korisničkih uloga u Javi za Spring Security.

2. Provjera korisničke uloge u Javi

Spring Security pruža nekoliko načina za provjeru korisničkih uloga u Java kodu. U nastavku ćemo pogledati svaku od njih.

2.1. @PreAuthorize

Prvi način da provjerite ima li korisničkih uloga u Javi je upotreba @PreAuthorize napomena koju pruža Spring Security. Ova se napomena može primijeniti na klasu ili metodu i prihvaća jednu vrijednost niza koja predstavlja SpEL izraz.

Prije nego što možemo koristiti ovu napomenu, prvo moramo omogućiti globalnu sigurnost metode. To se može učiniti u Java kodu dodavanjem datoteke @EnableGlobalMethodSecurity napomena bilo kojoj klasi konfiguracije.

Zatim, Spring Security pruža dva izraza koja možemo koristiti s @PreAuthorize napomena za provjeru korisničkih uloga:

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

Također možemo provjeriti više uloga u jednom izrazu:

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

U tom će slučaju zahtjev biti dopušten ako korisnik to učini bilo koji navedenih uloga.

Ako se metoda pozove bez odgovarajuće uloge, Spring Security baca iznimku i preusmjerava na stranicu pogreške.

2.2. SecurityContext

Sljedeći način na koji možemo provjeriti ima li korisničkih uloga u Java kodu je pomoću SecurityContext razred.

Prema zadanim postavkama Spring Security koristi lokalnu kopiju ove klase. To znači svaki zahtjev u našoj aplikaciji ima svoj sigurnosni kontekst koji sadrži pojedinosti korisnika koji podnosi zahtjev.

Da bismo ga koristili, jednostavno pozivamo statičke metode u SecurityContextHolder:

Autentifikacija auth = SecurityContextHolder.getContext (). GetAuthentication (); if (auth! = null && auth.getAuthorities (). stream (). anyMatch (a -> a.getAuthority (). jednako ("ADMINISTRATOR"))) {...}

Imajte na umu da ovdje koristimo obično ime ovlaštenja umjesto punog imena uloge.

To dobro funkcionira kada su nam potrebne više finoćenih provjera - na primjer, određeni dio jedne metode. Međutim, ovaj pristup neće raditi ako u Spring Security koristimo način globalnog držača konteksta.

2.3. UserDetailsService

Treći način na koji možemo potražiti korisničke uloge u Java kodu je pomoću UserDetailsService. Ovo zrno graha možemo ubaciti bilo gdje u našu aplikaciju i nazvati ga prema potrebi:

@GetMapping ("/ users") javni niz getUsers () {UserDetails detalji = userDetailsService.loadUserByUsername ("mike"); if (detalji! = null && detalji.getAuthorities (). stream () .anyMatch (a -> a.getAuthority (). jednako ("ADMINISTRATOR"))) {// ...}}

Opet, ovdje moramo koristiti naziv ovlaštenja, a ne puno ime uloge s prefiksom.

Prednost ovog pristupa je u tome što možemo provjeriti uloge za bilo kojeg korisnika, ne samo onaj koji je podnio zahtjev.

2.4. Zahtjev za servlet

Ako koristimo Spring MVC, također možemo provjeriti korisničke uloge u Javi pomoću HttpServletRequest razred:

@GetMapping ("/ users") javni niz getUsers (HttpServletRequest zahtjev) {if (request.isUserInRole ("ROLE_ADMIN")) {...}}

3. Zaključak

U ovom smo članku vidjeli nekoliko različitih načina provjere uloga pomoću Java koda s Spring Security.

Kao i uvijek, primjeri koda iz ovog članka mogu se naći na GitHubu.


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