6

OAuth 2.0, OpenID Connect, Keycloak a Spring Boot 3 -- Roly používateľov a autor...

 1 year ago
source link: https://novotnyr.github.io/scrolls/oauth-oidc-keycloak-spring-boot-3-roly/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

OAuth 2.0, OpenID Connect, Keycloak a Spring Boot 3

OAuth 2.0, OpenID Connect, Keycloak a Spring Boot 3 – Roly používateľov a autorizácia

2023/03/26

Roly (roles) umožňujú v Keycloaku pridávať používateľom ľubovoľné „nálepky“, z ktorých je potom možné odvodzovať rozličné druhy oprávnení (permissions). Rolou je admin, guest, teller, čokoľvek.

Ukážeme si:

  1. Ako možno pridať rolu používateľovi v rámci clienta.

  2. Ako v REST API (Spring Boot) vytiahnuť rolu.

  3. Ako v REST API určiť autorizáciu: teda prístup k niektorému volaniu len pre vybrané roly.

Pridávanie roly

Vytváranie roly pre klienta megabank

Prihlásme sa do administrátorskej konzoly Keycloaku ako administrátorky (obvykle konto admin).

Rolu môžeme vytvoriť buď pre celý realm alebo len pre konkrétneho klienta. Skúsme vytvoriť pre našu megabanku z predošlých dielov rolu withdrawer pre človeka, ktorý si dokáže vybrať peniaze.

client role add

V bloku Clients na karte Roles vytvorme novú rolu tlačidlom Create Role.

Použime názov roly (withdrawer) a prípadný popis.

Rola je tým vytvorená a môžeme ju pridať používateľovi!

Pridanie roly používateľovi

V bočnej lište v sekcii Users kliknime na používateľa harald a pridajme mu rolu.

assign role

Na karte Role Mapping priraďme rolu tlačidlom Assign Role.

Uvidíme zoznam rolí — ale keďže ide o zoznam rolí celého realmu a nie klienta, musíme rolu vyhľadať cez textové pole — ale predtým ešte prepnime vo filtri možnosť na Filter by clients.

assign role to user

Vyberme rolu a priraďme ju používateľovi — a to je všetko!

Rola a tokeny JWT

Rola klienta sa automaticky objaví v tokene JWT. Skúsme spustiť klasické prihlásenie cez flow ROPC:

Po dekódovaní tokenu JWT uvidíme claim resource_access:

Roly a Spring Security

Roly z tokenu JWT môžeme namapovať na roly v Spring Security.

Do aplikačného kontextu v Springu dodáme objekt typu Converter<Jwt, Collection<GrantedAuthority>>, ktorý zmení token JWT na zoznam autorít (rolí) v Spring Security.
KeycloakClaimRoleAuthoritiesConverter.java

Dodajme potom bean v podobne metódy:

1 Autority v Spring Security budeme prevádzať pomocou nášho konvertéra.
2 Ako bonus vieme nastaviť meno principala z claimu, ktorý obsahuje meno používateľa namiesto jeho identifikátora UUID.

Roly a autorizácie

Toto všetko môžeme skombinovať aj do overovania rolí pri volaní metód.

  • Zapneme podporu pre autorizáciu volania metód.

  • Dodáme nad metódu overovanie role.

Podpora pre autorizáciu volania metód

Od Spring Security 6.0 používame anotáciu @EnableMethodSecurity.

V starších Spring Security bola štandardom anotácia @EnableGlobalMethodSecurity.

Teraz dodáme anotáciu @PreAuthorize, ktorá sa spustí iba ak má používateľ rolu withdrawer nastavenú v Keycloaku. V opačnom prípade získame stavový kód 503 (Forbidden).

Roly v rámci realmu

Používateľovi môžeme priradiť aj globálnu rolu platnú pre celý realm, teda pre všetkých klientov.

Rolu potom pridáme v administrátorskej konzole v sekcii Realm Roles.

realm roles

Tlačidlom Create Role vytvoríme rolu takým istým spôsobom ako v prípade roly pre konkrétneho klienta. Vytvorme teda rolu creditor

Rolu priradíme používateľovi podobne ako v prípade roly klienta, ba dokonca ju automaticky uvidíme v zozname rolí a nemusíme ju vyhľadávať.

assign realm role

Roly realmu a JWT

Roly realmu sa objavia v tokene JWT na inom mieste, budú schované v claime realm_access v podobe zanoreného JSONu.

Vidíme rolu creditor a niekoľko implicitných systémových rolí.

Aj tieto roly vieme namapovať na roly / autority v Spring Security. Konverter bude vyzerať trochu inak:

KeycloakAuthoritiesConverter.java

Samozrejme, musíme sa rozhodnúť, ktorý konverter použijeme ako bean — či ten, ktorý vyťahuje roly z realmu alebo klienta.

Na domácu úlohu si môžeme implementovať kompozitný konverter, ktorý zlúči roly realmu s rolami _klienta.

Všetko ostatné sa zachová: automaticky máme k dispozícii roly dostupné v @Secured či @PreAuthorize.

Repozitár

Zdrojové kódy pre celý repozitár sú na GitHube, v repozitári novotnyr/bank-restapi-oidc.

>> Home


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK