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 ID Né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.