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.