Egyszerű egyszeri bejelentkezés a Spring Security OAuth2 segítségével

1. Áttekintés

Ebben az oktatóanyagban megvitatjuk a megvalósítás módját SSO - egyszeri bejelentkezés - a Spring Security OAuth és a Spring Boot használatával, a Keycloak használatával mint Authorization Server.

4 külön alkalmazást fogunk használni:

  • Authorization Server - amely a központi hitelesítési mechanizmus
  • Erőforrás-kiszolgáló - a Foos
  • Két kliens alkalmazás - az egyszeri bejelentkezést használó alkalmazások

Egyszerűen fogalmazva: amikor egy felhasználó megpróbál hozzáférni egy erőforráshoz egy ügyfélalkalmazáson keresztül, akkor először a hitelesítésre irányítják át az Authorization Serveren keresztül. A Keycloak bejelentkezik a felhasználóba, és miközben továbbra is bejelentkezik az első alkalmazásba, ha a második kliens alkalmazást ugyanazon a böngészőn keresztül érik el, a felhasználónak nem kell újra megadnia hitelesítő adatait.

Használni fogjuk a megerősítő kód adjon meg egy típust az OAuth2-ből a hitelesítés delegálásának elősegítésére.

Az OAuth-csomagot a Spring Security 5-ben fogjuk használni. Ha használni szeretné a Spring Security OAuth örökölt veremét, olvassa el ezt a korábbi cikket: Egyszerű egyszeri bejelentkezés a Spring Security OAuth2-vel (régi verem)

A migrációs útmutató szerint:

A Spring Security ezt a szolgáltatást OAuth 2.0 bejelentkezésként, míg a Spring Security OAuth egyszeri bejelentkezésként említi

Rendben, ugorjunk be.

2. A hitelesítési kiszolgáló

Korábban a Spring Security OAuth verem lehetőséget kínált egy Authorization Server telepítésére tavaszi alkalmazásként.

Az OAuth-verem azonban Spring elavult, és most a Keycloak-ot fogjuk használni hitelesítési kiszolgálónkként.

Tehát ezúttal be fogjuk állítani az Engedélyezési kiszolgálót beágyazott Keycloak szerverként egy Spring Boot alkalmazásban.

Az előkonfigurációnkban meghatározunk két klienst, ssoClient-1 és ssoClient-2, minden kliens alkalmazáshoz egyet.

3. Az erőforrás-kiszolgáló

Ezután szükségünk van egy erőforrás-kiszolgálóra vagy a REST API-ra, amely biztosítja a számunkra a Foos a kliens alkalmazásunk elfogyasztja.

Lényegében megegyezik azzal, amit korábban az Angular Client Apps-hez használtunk.

4. Az ügyfélalkalmazások

Most nézzük meg a Thymeleaf Client alkalmazást; természetesen a Spring Boot-ot használjuk a konfiguráció minimalizálása érdekében.

Ne feledje ezt ezekből kettőre lesz szükségünk az egyszeri bejelentkezés funkcióinak bemutatásához.

4.1. Maven-függőségek

Először a következő függőségekre lesz szükségünk 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 

Az összes szükséges ügyféltámogatás, beleértve a biztonságot is, csak hozzá kell adnunk spring-boot-starter-oauth2-kliens. Továbbá, mivel a régi RestTemplate megszűnik, használni fogjuk Web Ügyfél, és ezért tettük hozzá tavaszi-webflux és reaktor-netty.

4.2. Biztonsági konfiguráció

Ezután a legfontosabb rész, az első ügyfélalkalmazás biztonsági konfigurációja:

Az @EnableWebSecurity nyilvános osztály, az UiSecurityConfig kiterjeszti a WebSecurityConfigurerAdapter {@Orride public void configure (HttpSecurity http) dobja a {http.antMatcher ("/ **") .authorizeRequests () .antMatchers ("/") .permitAll (() ". hitelesített () .és () .oauth2Login (); } @Bean WebClient webClient (ClientRegistrationRepository clientRegistrationRepository, OAuth2AuthorizedClientRepository engedéllyelClientRepository) {ServletOAuth2AuthorizedClientExchangeFilterFunction oauth2 = új ServletOAuth2AuthorizedCterationExpressionRelectRealitorExpress oauth2.setDefaultOAuth2AuthorizedClient (true); adja vissza a WebClient.builder (). Apply (oauth2.oauth2Configuration ()). build (); }}

Ennek a konfigurációnak a központi része a oauth2Login () módszer, amelyet a Spring Security OAuth 2.0 bejelentkezési támogatásának engedélyezésére használnak. Mivel a Keycloak alkalmazást használjuk, amely alapértelmezés szerint egyszeri bejelentkezési megoldás a webalkalmazásokhoz és a RESTful webszolgáltatásokhoz, nem kell további konfigurációt adnunk az egyszeri bejelentkezéshez.

Végül meghatároztuk a Web Ügyfél bab egyszerű HTTP-kliensként viselkedik az erőforrás-kiszolgálónknak küldendő kérések kezelésében.

És itt van a alkalmazás.yml:

tavasz: biztonság: oauth2: kliens: regisztráció: custom: kliens-azonosító: ssoClient-1 kliens-titok: ssoClientSecret-1 hatókör: olvasás, írás engedély-megadás-típus: autoritás_kód átirányítás-uri: // localhost: 8082 / ui- one / login / oauth2 / code / custom szolgáltató: custom: authentication-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 felhasználói név-attribútum: preferált_felhasználónév thymeleaf: cache: hamis szerver: port: 8082 szervlet: context-path: / ui-one resourceserver: api: project: url: // localhost: 8081 / sso-resource-server / api / foos / 

Itt, tavasz.biztonság.oauth2.ügyfel.regisztráció az ügyfél regisztrálásának gyökér névtere. Meghatároztunk egy regisztrációs azonosítójú klienst egyedi. Aztán meghatároztuk Ügyfélazonosító, ügyfél-titok, hatálya, engedély-támogatás típusa és átirányítás-uri, amelynek természetesen meg kell egyeznie az engedélyezési kiszolgálónkkal megadottal.

Ezt követően meghatároztuk szolgáltatónkat vagy az Authorization Server-t, ismét ugyanazzal az azonosítóval egyedi, és felsorolta a Spring Security által használt különböző URI-kat. Ennyit kell meghatároznunk, és a keretrendszer zökkenőmentesen elvégzi számunkra a teljes bejelentkezési folyamatot, beleértve a Keycloakba történő átirányítást is.

Vegye figyelembe azt is, hogy az itt bemutatott példánkban mi hoztuk létre a Authorization Serverünket, de természetesen használhatunk más, harmadik féltől származó szolgáltatókat is, például a Facebookot vagy a GitHub-ot.

4.3. A Vezérlő

Most kérjük, valósítsuk meg vezérlőnket az Ügyfélalkalmazásban Foos az erőforrás-szerverünkről:

@Controller public class FooClientController {@Value ("$ {resourceserver.api.url}") private String fooApiUrl; @Autowired private WebClient webClient; @GetMapping ("/ foos") public karakterlánc getFoos (modellmodell) {List foos = this.webClient.get () .uri (fooApiUrl) .retrieve () .bodyToMono (új ParameterizedTypeReference() { }) .Blokk(); model.addAttribute ("foos", foos); visszatér "foos"; }}

Mint láthatjuk, itt csak egy módszerünk van, amely elosztja az erőforrásokat a foos sablon. Nem kellett kódot adnunk a bejelentkezéshez.

4.4. Front End

Most vessünk egy pillantást az ügyfélalkalmazás elülső konfigurációjára. Itt nem erre fogunk összpontosítani, főleg azért, mert a webhelyen már bemutattuk.

Ügyfélalkalmazásunk itt nagyon egyszerű kezelőfelülettel rendelkezik; itt van a index.html:

Tavaszi OAuth kliens Thymeleaf - 1 Üdvözöljük!

Belépés

És a foos.html:

Tavaszi OAuth kliens Thymeleaf -1 Szia, preferált_felhasználónév 
IDNév
Nincs hölgy
ID Név

A foos.html oldalnak hitelesítenie kell a felhasználókat. Ha egy nem hitelesített felhasználó megpróbál hozzáférni foos.html, először a Keycloak bejelentkezési oldalára irányítják át őket.

4.5. A második kliens alkalmazás

Konfigurálunk egy második alkalmazást, Tavaszi OAuth kliens Thymeleaf -2 másikat használva ÜgyfélazonosítóssoClient-2.

Leginkább ugyanaz lesz, mint az első alkalmazás, amelyet éppen leírtunk.

A alkalmazás.yml különbözni fog, ha tartalmaz egy másikat Ügyfélazonosító, client_secret és átirányítás_uri annak tavasz.biztonság.oauth2.ügyfél.regisztráció:

tavasz: biztonság: oauth2: kliens: regisztráció: custom: kliens-azonosító: ssoClient-2 kliens-titok: ssoClientSecret-2 hatókör: olvasás, írás engedély-megadás-típus: autoritás_kód átirányítás-uri: // localhost: 8084 / ui- kettő / login / oauth2 / code / custom

Természetesen más szerver portra is szükségünk van hozzá, hogy párhuzamosan futtathassuk őket:

szerver: port: 8084 servlet: context-path: / ui-two

Végül csiszoljuk az elülső HTML-eket, hogy legyen címe Tavaszi OAuth kliens Thymeleaf - 2 ahelyett – 1 hogy meg tudjuk különböztetni a kettőt.

5. Az egyszeri bejelentkezés viselkedésének tesztelése

Az egyszeri bejelentkezés viselkedésének teszteléséhez futtassuk az Alkalmazásainkat.

Szükségünk lesz mind a 4 rendszerindító alkalmazásunkra - a Hitelesítés-kiszolgálóra, az Erőforrás-kiszolgálóra és mindkét ügyfélalkalmazásra -, hogy működhessenek ehhez.

Most nyissunk meg egy böngészőt, mondjuk a Chrome-ot, és jelentkezzünk be Ügyfél-1 a hitelesítő adatok felhasználásával [e-mail védett] / 123. Ezután egy másik ablakban vagy lapon nyomja meg a (z) URL címét 2. kliens. A bejelentkezés gombra kattintva átirányítunk a Foos oldal azonnal, megkerülve a hitelesítési lépést.

Hasonlóképpen, ha a felhasználó bejelentkezik a 2. kliens először nem kell megadnia a felhasználónevét / jelszavát Ügyfél-1.

6. Következtetés

Ebben az oktatóanyagban az egyszeri bejelentkezés megvalósítására összpontosítottunk a Spring Security OAuth2 és a Spring Boot használatával, a Keycloakot használva identitásszolgáltatóként.

Mint mindig, a teljes forráskód megtalálható a GitHubon.