Tavaszi biztonság: Ellenőrizze, hogy a felhasználónak van-e szerepe a Java-ban
1. Bemutatkozás
A Spring Security programban néha ellenőrizni kell, hogy a hitelesített felhasználónak van-e meghatározott szerepe. Ez hasznos lehet az alkalmazások bizonyos funkcióinak engedélyezéséhez vagy letiltásához.
Ebben az oktatóanyagban különböző módokat fogunk megnézni a Java szerepkörök ellenőrzéséhez a Spring for Spring Security számára.
2. A felhasználói szerepkör ellenőrzése a Java-ban
A Spring Security többféleképpen is ellenőrizheti a felhasználói szerepeket a Java-kódban. Az alábbiakban mindegyiket megvizsgáljuk.
2.1. @PreAuthorize
A Java felhasználói szerepkörök ellenőrzésének első módja a @PreAuthorize annotációt a Spring Security nyújtotta. Ez a kommentár alkalmazható egy osztályra vagy módszerre, és egyetlen sztring értéket fogad el, amely egy SpEL kifejezést képvisel.
Mielőtt használhatnánk ezt a kommentárt, először engedélyeznünk kell a globális módszerbiztonságot. Ezt Java kódban lehet megtenni a @EnableGlobalMethodSecurity jelölés bármely konfigurációs osztályhoz.
Ezután a Spring Security két kifejezést ad meg, amelyeket a @PreAuthorize kommentár a felhasználói szerepkörök ellenőrzéséhez:
@PreAuthorize ("hasRole ('ROLE_ADMIN')") @GetMapping ("/ user / {id}") nyilvános karakterlánc getUser (@PathVariable ("id") karakterlánc azonosító) {...}
Több szerepet is ellenőrizhetünk egyetlen kifejezésben:
@PreAuthorize ("hasAnyRole ('ROLE_ADMIN', 'ROLE_MANAGER')") @GetMapping ("/ users") nyilvános karakterlánc getUsers () {...}
Ebben az esetben a kérés akkor engedélyezett, ha a felhasználó ezt megtette Bármi a megadott szerepkörök közül.
Ha a metódust a megfelelő szerepkör nélkül hívják meg, a Spring Security kivételt vet és átirányítja a hiba oldalra.
2.2. SecurityContext
A Java-kódban a következő módon ellenőrizhetjük a felhasználói szerepeket: SecurityContext osztály.
Alapértelmezés szerint a Spring Security az osztály szál-helyi másolatát használja. Ez azt jelenti, hogy Az alkalmazásunk minden egyes kérésének megvan a biztonsági kontextusa, amely tartalmazza a kérelmet benyújtó felhasználó adatait.
Használatához egyszerűen behívjuk a statikus módszereket SecurityContextHolder:
Hitelesítés auth = SecurityContextHolder.getContext (). GetAuthentication (); if (auth! = null && auth.getAuthorities (). stream (). anyMatch (a -> a.getAuthority (). egyenlő ("ADMIN"))) {...}
Vegye figyelembe, hogy itt a sima jogosultsági nevet használjuk a teljes szerepnév helyett.
Ez jól működik, ha finomabb részletekre van szükségünk - például egyetlen módszer meghatározott részéhez. Azonban, ez a megközelítés nem fog működni, ha a globális kontextustartó módot használjuk a Spring Security programban.
2.3. UserDetailsService
A felhasználói szerepek keresése a Java kódban a harmadik módszer a UserDetailsService. Ezt a babot bárhová beadhatjuk alkalmazásunkba, és szükség szerint felhívhatjuk:
@GetMapping ("/ users") public String getUsers () {UserDetails details = userDetailsService.loadUserByUsername ("mike"); if (részletek! = null && details.getAuthorities (). stream () .anyMatch (a -> a.getAuthority (). egyenlő ("ADMIN"))) {// ...}}
Itt is a hatóság nevét kell használnunk, nem pedig a teljes szerepnevet előtaggal együtt.
Ennek a megközelítésnek az az előnye, hogy bármely felhasználó számára ellenőrizhetjük a szerepeket, nem csak az kérelmező.
2.4. Servlet kérés
Ha a Spring MVC-t használjuk, akkor a Java segítségével is ellenőrizhetjük a felhasználói szerepeket HttpServletRequest osztály:
@GetMapping ("/ users") nyilvános karakterlánc getUsers (HttpServletRequest kérés) {if (request.isUserInRole ("ROLE_ADMIN")) {...}}
3. Következtetés
Ebben a cikkben számos különböző módszert láthattunk a szerepkörök ellenőrzésére a Java kóddal a Spring Security alkalmazással.
Mint mindig, a cikk kód példái megtalálhatók a GitHubon.