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.