Jednoduché jednotné prihlásenie s jarným zabezpečením OAuth2

1. Prehľad

V tomto výučbe si povieme, ako implementovať SSO - Single Sign On - pomocou Spring Security OAuth a Spring Boot, pomocou Keycloak ako autorizačný server.

Budeme používať 4 samostatné aplikácie:

  • Autorizačný server - čo je centrálny autentifikačný mechanizmus
  • Zdrojový server - poskytovateľ servera Foos
  • Dve klientske aplikácie - aplikácie využívajúce jednotné prihlásenie

Veľmi zjednodušene povedané, keď sa používateľ pokúsi získať prístup k prostriedku prostredníctvom jednej klientskej aplikácie, bude presmerovaný na autentifikáciu ako prvý prostredníctvom autorizačného servera. Keycloak používateľa prihlási a zatiaľ, čo je stále prihlásený do prvej aplikácie, ak je druhá klientská aplikácia prístupná pomocou rovnakého prehliadača, používateľ nebude musieť znova zadávať svoje prihlasovacie údaje.

Budeme používať autorizačný kód typ grantu z OAuth2 na riadenie delegovania autentifikácie.

Zásobník OAuth použijeme v Spring Security 5. Ak chcete použiť starší zásobník Spring Security OAuth, pozrite si tento predchádzajúci článok: Jednoduché jednotné prihlásenie pomocou Spring Security OAuth2 (starší zásobník)

Podľa sprievodcu migráciou:

Spring Security označuje túto funkciu ako prihlásenie OAuth 2.0, zatiaľ čo Spring Security OAuth ju označuje ako SSO

Dobre, poďme priamo dovnútra.

2. Autorizačný server

Zásobník Spring Security OAuth predtým ponúkol možnosť nastavenia autorizačného servera ako jarnej aplikácie.

Zásobník OAuth bol však jarom zastaraný a teraz budeme ako autorizačný server používať Keycloak.

Tentokrát teda nastavíme náš autorizačný server ako zabudovaný server Keycloak v aplikácii Spring Boot.

V našej predkonfigurácii definujeme dvoch klientov, ssoClient-1 a ssoClient-2, jeden pre každú klientsku aplikáciu.

3. Zdrojový server

Ďalej potrebujeme Resource Server alebo REST API, ktoré nám poskytnú Foos naša klientská aplikácia bude konzumovať.

Je to v podstate to isté, čo sme predtým používali pre naše uhlové klientske aplikácie.

4. Klientske aplikácie

Teraz sa pozrime na našu klientsku aplikáciu Thymeleaf; na minimalizáciu konfigurácie samozrejme použijeme Spring Boot.

Pamätajte na to na preukázanie funkčnosti Single Sign-On budeme musieť mať dve z nich.

4.1. Maven závislosti

Najprv budeme potrebovať nasledujúce závislosti v našom pom.xml:

 org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-oauth2-client org.springframework.boot spring-boot-starter-thymeleaf org.thymeleaf.extras thymeleaf-extras-springsecurity5 org. springframework spring-webflux io.projectreactor.netty reaktor-netty 

Aby sme mohli zahrnúť všetku potrebnú podporu klienta, vrátane zabezpečenia, je potrebné dodať spring-boot-starter-oauth2-client. Tiež od starej RestTemplate bude zastarané, použijeme Webový klient, a preto sme pridali spring-webflux a reaktor-netty.

4.2. Konfigurácia zabezpečenia

Najdôležitejšou časťou je konfigurácia zabezpečenia našej prvej klientskej aplikácie:

@EnableWebSecurity verejná trieda UiSecurityConfig rozširuje WebSecurityConfigurerAdapter {@Override public void configure (HttpSecurity http) vyvoláva výnimku {http.antMatcher ("/ **") .authorizeRequests () .antMatchers ("/") .permitAll () .anyRequest authenticated (). a () .oauth2Login (); } @Bean WebClient webClient (ClientRegistrationRepository clientRegistrationRepository, OAuth2AuthorizedClientRepository authorizedClientRepository) {ServletOAuth2AuthorizedClientExchangeFilterFunction oauth2 = nový ServletOAuth2AuthorizedClientExchangeFilterFunction oauth2.setDefaultOAuth2AuthorizedClient (true); vrátiť WebClient.builder (). apply (oauth2.oauth2Configuration ()). build (); }}

Jadrom tejto konfigurácie je oauth2Login () metóda, ktorá sa používa na povolenie podpory prihlásenia Spring Security’s OAuth 2.0. Pretože používame Keycloak, ktorý je predvolene riešením jednotného prihlásenia pre webové aplikácie a webové služby RESTful, nemusíme pre SSO pridávať ďalšiu konfiguráciu.

Nakoniec sme definovali aj a Webový klient bean bude pôsobiť ako jednoduchý klient HTTP na vybavenie požiadaviek na odoslanie na náš zdrojový server.

A tu je aplikácia.yml:

pružina: zabezpečenie: oauth2: klient: registrácia: zvyk: client-id: ssoClient-1 client-secret: ssoClientSecret-1 rozsah: čítať, zapisovať autorizácia-typ grantu: autorizácia_kód presmerovanie-uri: // localhost: 8082 / ui- one / login / oauth2 / code / custom provider: custom: authorization-uri: // localhost: 8083 / auth / realms / baeldung / protocol / openid-connect / auth token-uri: // localhost: 8083 / auth / realms / baeldung / protocol / openid-connect / token user-info-uri: // localhost: 8083 / auth / realms / baeldung / protocol / openid-connect / userinfo meno-používateľa-atribút: preferované_uzivatelske meno thymeleaf: cache: false server: port: 8082 servlet: context-path: / ui-one resourceserver: api: project: url: // localhost: 8081 / sso-resource-server / api / foos / 

Tu, spring.security.oauth2.client.registration je koreňový priestor názvov na registráciu klienta. Definovali sme klienta s registračným ID zvyk. Potom sme definovali jeho ID klienta, klientske tajomstvo, rozsah, autorizácia-typ grantu a presmerovanie-uri, ktoré by samozrejme mali byť rovnaké ako tie, ktoré sú definované pre náš autorizačný server.

Potom sme definovali nášho poskytovateľa služieb alebo autorizačný server, opäť s rovnakým ID zvyka sú uvedené rôzne jeho identifikátory URI, ktoré môže Spring Security použiť. To je všetko, čo musíme definovať, a rámec pre nás celý proces prihlásenia vrátane presmerovania na Keycloak robí bez problémov.

Upozorňujeme tiež, že v našom príklade tu sme zaviedli náš autorizačný server, ale samozrejme môžeme použiť aj iných poskytovateľov tretích strán, ako sú Facebook alebo GitHub.

4.3. Kontrolór

Teraz požiadajme o implementáciu nášho kontrolóra v klientskej aplikácii Foos z nášho servera zdrojov:

@Controller verejná trieda FooClientController {@Value ("$ {resourceserver.api.url}") private String fooApiUrl; @Autowired private WebClient webClient; @GetMapping ("/ foos") public String getFoos (model model) {List foos = this.webClient.get () .uri (fooApiUrl) .retrieve () .bodyToMono (nový ParameterizedTypeReference() {}) .block (); model.addAttribute ("foos", foos); vrátiť "foos"; }}

Ako vidíme, máme tu iba jednu metódu, ktorá vyčerpá zdroje pre foos šablóna. Na prihlásenie sme nemuseli pridávať žiadny kód.

4.4. Frontend

Poďme sa teraz pozrieť na front-endovú konfiguráciu našej klientskej aplikácie. Na toto sa tu nebudeme sústrediť, hlavne preto, že sme sa už na stránke zaoberali.

Naša klientská aplikácia má veľmi jednoduché klientske rozhranie; tu je index.html:

Jarný klient OAuth Thymeleaf - 1 Vitajte!

Prihlásiť sa

A foos.html:

Jarný klient OAuth Thymeleaf -1 Ahoj, preferované_používateľské meno 
IDnázov
Žiadni foos
ID názov

The foos.html stránka vyžaduje, aby boli používatelia autentifikovaní. Ak sa neoverený používateľ pokúsi o prístup foos.html, najskôr budú presmerovaní na prihlasovaciu stránku Keycloak.

4.5. Druhá klientská aplikácia

Nakonfigurujeme druhú aplikáciu, Jarný klient OAuth Thymeleaf -2 pomocou iného client_idssoClient-2.

Bude to väčšinou to isté ako prvá aplikácia, ktorú sme práve opísali.

The aplikácia.yml sa bude líšiť tak, že bude obsahovať inú client_id, client_secret a presmerovanie_uri v jeho spring.security.oauth2.client.registration:

pružina: zabezpečenie: oauth2: klient: registrácia: zvyk: client-id: ssoClient-2 client-secret: ssoClientSecret-2 rozsah: čítať, písať autorizácia-typ grantu: autorizácia_kód presmerovanie-uri: // localhost: 8084 / ui- two / login / oauth2 / code / custom

A samozrejme musíme mať aj iný port servera, aby sme ich mohli spúšťať paralelne:

server: port: 8084 servlet: kontextová cesta: / ui-two

Na záver vyladíme frontendové HTML, aby mali názov ako Jarný klient OAuth Thymeleaf - 2 namiesto – 1 aby sme medzi nimi mohli rozlišovať.

5. Testovanie správania SSO

Ak chcete otestovať správanie SSO, spustime naše aplikácie.

Aby sme to dosiahli, budeme potrebovať všetky naše 4 zavádzacie aplikácie - autorizačný server, zdrojový server a obe klientske aplikácie.

Teraz otvorme prehliadač, povedzme Chrome a prihlásime sa Klient-1 pomocou prihlasovacích údajov [chránené e-mailom] / 123. Ďalej v inom okne alebo na karte kliknite na adresu URL pre Klient-2. Po kliknutí na prihlasovacie tlačidlo budete presmerovaní na stránku Foos stránka hneď, pričom sa obíde krok autentifikácie.

Podobne, ak sa používateľ prihlási do Klient-2 najskôr nemusia zadávať svoje používateľské meno / heslo pre Klient-1.

6. Záver

V tomto tutoriáli sme sa zamerali na implementáciu Single Sign-On pomocou Spring Security OAuth2 a Spring Boot pomocou Keycloak ako poskytovateľa identity.

Celý zdrojový kód nájdete ako vždy na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found