Jarná bezpečnosť: Skontrolujte, či má používateľ úlohu v prostredí Java
1. Úvod
V rámci jarnej bezpečnosti je niekedy potrebné skontrolovať, či má autentifikovaný užívateľ konkrétnu rolu. To môže byť užitočné pri povolení alebo zakázaní konkrétnych funkcií v našich aplikáciách.
V tomto výučbe sa dozvieme rôzne spôsoby kontroly rolí používateľov v prostredí Java pre jarné zabezpečenie.
2. Kontrola roly používateľa v prostredí Java
Spring Security poskytuje niekoľko spôsobov kontroly rolí používateľov v kóde Java. Na každú z nich sa pozrieme nižšie.
2.1. @PreAuthorize
Prvým spôsobom, ako skontrolovať roly používateľov v prostredí Java, je použitie súboru @PreAuthorize anotácia poskytnutá Spring Security. Túto anotáciu je možné použiť na triedu alebo metódu a prijíma jednu hodnotu reťazca, ktorá predstavuje výraz SpEL.
Predtým, ako budeme môcť použiť túto anotáciu, musíme najskôr povoliť zabezpečenie globálnej metódy. To je možné vykonať v kóde Java pridaním súboru @EnableGlobalMethodSecurity anotácia k akejkoľvek konfiguračnej triede.
Potom Spring Security poskytuje dva výrazy, ktoré môžeme použiť s @PreAuthorize anotácia na kontrolu rolí používateľov:
@PreAuthorize ("hasRole ('ROLE_ADMIN')") @GetMapping ("/ user / {id}") verejný reťazec getUser (@PathVariable ("id") reťazec) {...}
Môžeme tiež skontrolovať viac rolí v jednom výraze:
@PreAuthorize ("hasAnyRole ('ROLE_ADMIN', 'ROLE_MANAGER')") @GetMapping ("/ users") verejný reťazec getUsers () {...}
V takom prípade bude žiadosť povolená, ak to používateľ má akýkoľvek uvedených rolí.
Ak sa metóda volá bez toho, aby mala správnu rolu, Spring Security vyvolá výnimku a presmeruje na chybovú stránku.
2.2. SecurityContext
Ďalším spôsobom, ako môžeme skontrolovať roly používateľov v kóde Java, je kód SecurityContext trieda.
V predvolenom nastavení Spring Security používa lokálnu kópiu tejto triedy pre vlákno. To znamená každá požiadavka v našej aplikácii má svoj bezpečnostný kontext, ktorý obsahuje podrobnosti o používateľovi, ktorý podáva žiadosť.
Ak ho chcete použiť, jednoducho zavoláme statické metódy v SecurityContextHolder:
Autentifikácia auth = SecurityContextHolder.getContext (). GetAuthentication (); if (auth! = null && auth.getAuthorities (). stream (). anyMatch (a -> a.getAuthority (). equals ("ADMIN"))) {...}
Upozorňujeme, že namiesto celého názvu roly tu používame obyčajný názov orgánu.
To funguje dobre, keď potrebujeme podrobnejšie kontroly - napríklad konkrétnu časť jednej metódy. Avšak tento prístup nebude fungovať, ak v Spring Security použijeme režim globálneho držiteľa kontextu.
2.3. UserDetailsService
Tretím spôsobom, ako môžeme vyhľadať roly používateľov v kóde Java, je použitie súboru UserDetailsService. Túto fazuľu môžeme vpichnúť kdekoľvek do našej aplikácie a nazvať ju podľa potreby:
@GetMapping ("/ users") public String getUsers () {UserDetails details = userDetailsService.loadUserByUsername ("mike"); if (details! = null && details.getAuthorities (). stream () .anyMatch (a -> a.getAuthority (). equals ("ADMIN"))) {// ...}}
Opäť tu musíme použiť názov orgánu, nie celý názov role s predponou.
Výhodou tohto prístupu je, že môžeme skontrolovať roly pre každého používateľa, nielen toho, kto podal žiadosť.
2.4. Žiadosť o servlet
Ak používame Spring MVC, môžeme tiež skontrolovať užívateľské roly v Jave pomocou HttpServletRequest trieda:
@GetMapping ("/ users") public String getUsers (požiadavka HttpServletRequest) {if (request.isUserInRole ("ROLE_ADMIN")) {...}}
3. Záver
V tomto článku sme videli niekoľko rôznych spôsobov kontroly rolí pomocou kódu Java s funkciou Spring Security.
Ako vždy, príklady kódov z tohto článku nájdete na GitHub.