Enkel enkel pålogging med vårsikkerhets OAuth2

1. Oversikt

I denne veiledningen vil vi diskutere hvordan du implementerer SSO - Single Sign On - ved hjelp av Spring Security OAuth og Spring Boot, ved hjelp av Keycloak som autorisasjonsserver.

Vi bruker fire separate applikasjoner:

  • En autorisasjonsserver - som er den sentrale autentiseringsmekanismen
  • En ressursserver - leverandøren av Foos
  • To klientapplikasjoner - applikasjonene som bruker SSO

Veldig enkelt, når en bruker prøver å få tilgang til en ressurs via en klientapp, blir de omdirigert for å godkjenne først, gjennom autorisasjonsserveren. Keycloak vil logge på brukeren, og mens den fremdeles er logget inn i den første appen, vil brukeren ikke trenge å oppgi legitimasjonen sin igjen hvis den andre klientappen er tilgjengelig med samme nettleser.

Vi skal bruke Godkjennelseskoden gi typen ut av OAuth2 for å drive delegeringen av autentisering.

Vi bruker OAuth-stakken i Spring Security 5. Hvis du vil bruke Spring Security OAuth eldre stabel, kan du ta en titt på denne forrige artikkelen: Enkel enkelt pålogging med Spring Security OAuth2 (eldre stabel)

I henhold til migreringsguiden:

Spring Security refererer til denne funksjonen som OAuth 2.0-pålogging mens Spring Security OAuth refererer til den som SSO

Ok, la oss hoppe rett inn.

2. Autorisasjonsserveren

Tidligere tilbød Spring Security OAuth-stakken muligheten for å sette opp en autorisasjonsserver som en vårapplikasjon.

OAuth-stakken er imidlertid avviklet av Spring, og nå bruker vi Keycloak som autorisasjonsserver.

Så denne gangen setter vi opp autorisasjonsserveren vår som en innebygd Keycloak-server i en Spring Boot-app.

I vår forhåndskonfigurasjon, vi definerer to klienter, ssoClient-1 og ssoClient-2, en for hver klientapplikasjon.

3. Ressursserveren

Deretter trenger vi en ressursserver eller REST API som gir oss Foos vår klientapp vil konsumere.

Det er egentlig det samme som vi tidligere brukte for våre Angular Client Apps.

4. Klientapplikasjonene

La oss nå se på Thymeleaf Client Application; Vi bruker selvfølgelig Spring Boot for å minimere konfigurasjonen.

Husk det vi må ha to av disse for å demonstrere Single Sign-On-funksjonalitet.

4.1. Maven avhengigheter

Først trenger vi følgende avhengigheter i vår 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 reactor-netty 

For å inkludere all klientstøtte vi trenger, inkludert sikkerhet, trenger vi bare å legge til spring-boot-starter-oauth2-client. Også siden den gamle RestTemplate kommer til å bli utfaset, skal vi bruke WebClient, og det er derfor vi la til vår-webflux og reaktor-netty.

4.2. Sikkerhetskonfigurasjon

Deretter, den viktigste delen, sikkerhetskonfigurasjonen av vår første klientapplikasjon:

@EnableWebSecurity offentlig klasse UiSecurityConfig utvider WebSecurityConfigurerAdapter {@Override public void configure (HttpSecurity http) kaster unntak {http.antMatcher ("/ **") .authorizeRequests () .antMatchers ("/") .permitAll () .any. autentisert () .og () .oauth2Login (); } @Bean WebClient webClient (ClientRegistrationRepository clientRegistrationRepository, OAuth2AuthorizedClientRepository authorisedClientRepository) {ServletOAuth2AuthorizedClientExchangeFilterFunction oauth2 = new ServletOAuth2AuthorizedClientExchangeFilterFunction oauth2 = new ServletOAuth2AuthorizedClientExchangeFilterFunction oauth2.setDefaultOAuth2AuthorizedClient (true); returner WebClient.builder (). Apply (oauth2.oauth2Configuration ()). build (); }}

Kjernen i denne konfigurasjonen er oauth2Login () -metoden, som brukes til å aktivere Spring Securitys OAuth 2.0-påloggingsstøtte. Siden vi bruker Keycloak, som standard er en påloggingsløsning for webapper og RESTful-webtjenester, trenger vi ikke legge til noen ytterligere konfigurasjon for SSO.

Til slutt definerte vi også en WebClient bean for å fungere som en enkel HTTP-klient for å håndtere forespørsler om å bli sendt til vår ressursserver.

Og her er application.yml:

vår: sikkerhet: oauth2: klient: registrering: tilpasset: klient-id: ssoClient-1 klient-hemmelighet: ssoClientSecret-1 omfang: lese, skrive autorisasjon-tilskuddstype: autorisasjonskode omdirigere-uri: // localhost: 8082 / ui- en / login / oauth2 / kode / tilpasset leverandør: tilpasset: autorisasjon-uri: // localhost: 8083 / auth / realms / baeldung / protokoll / 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 user-name-attribute: foretrukket_brukernavn thymeleaf: cache: false server: port: 8082 servlet: context-path: / ui-one resourceserver: api: project: url: // localhost: 8081 / sso-resource-server / api / foos / 

Her, vår.sikkerhet.oauth2.client.registration er rotnavnet for registrering av en klient. Vi definerte en klient med registrerings-ID tilpasset. Så definerte vi dens klient-ID, klienthemmelighet, omfang, autorisasjon-tilskuddstype og omdirigere-uri, som selvfølgelig skal være den samme som den som er definert for autorisasjonsserveren vår.

Etter det definerte vi tjenesteleverandøren eller autorisasjonsserveren, igjen med samme ID som tilpasset, og listet opp de forskjellige URI-ene som Spring Security kan bruke. Det er alt vi trenger å definere, og rammeverket gjør hele innloggingsprosessen, inkludert omdirigering til Keycloak, sømløst for oss.

Legg også merke til at vi i vårt eksempel her rullet ut autorisasjonsserveren vår, men selvfølgelig kan vi også bruke andre tredjepartsleverandører som Facebook eller GitHub.

4.3. Kontrolleren

La oss nå implementere kontrolleren vår i klientappen for å be om Foos fra vår ressursserver:

@Controller offentlig klasse FooClientController {@Value ("$ {resourceserver.api.url}") privat streng fooApiUrl; @Autowired privat WebClient webClient; @GetMapping ("/ foos") offentlig streng getFoos (modellmodell) {Liste foos = this.webClient.get () .uri (fooApiUrl) .hent () .bodyToMono (ny ParameterizedTypeReference() {}) .block (); model.addAttribute ("foos", foos); returner "foos"; }}

Som vi kan se, har vi bare en metode her som vil skille ut ressursene til foos mal. Vi slapp å legge til noen kode for pålogging.

4.4. Front End

La oss ta en titt på front-end-konfigurasjonen av klientapplikasjonen vår. Vi kommer ikke til å fokusere på det her, hovedsakelig fordi vi allerede dekket inn på nettstedet.

Vår klientapplikasjon her har en veldig enkel front-end; her er index.html:

Spring OAuth Client Thymeleaf - 1 Velkommen!

Logg Inn

Og foos.html:

Spring OAuth Client Thymeleaf -1 Hei, foretrukket_brukernavn 
IDNavn
Ingen fiender
ID Navn

De foos.html siden må brukerne godkjennes. Hvis en ikke-godkjent bruker prøver å få tilgang foos.html, blir de omdirigert til Keycloaks påloggingsside først.

4.5. Den andre klientapplikasjonen

Vi konfigurerer en ny applikasjon, Spring OAuth Client Thymeleaf -2 bruker en annen klient-IDssoClient-2.

Det vil stort sett være det samme som den første applikasjonen vi nettopp beskrev.

De application.yml vil variere for å inkludere en annen klient-ID, klienthemmelighet og redirect_uri i sin vår.sikkerhet.oauth2.client.registration:

vår: sikkerhet: oauth2: klient: registrering: tilpasset: klient-id: ssoClient-2 klient-hemmelighet: ssoClientSecret-2 omfang: lese, skrive autorisasjon-tilskuddstype: autorisasjonskode omdirigere-uri: // localhost: 8084 / ui- to / login / oauth2 / code / custom

Og selvfølgelig må vi også ha en annen serverport, slik at vi kan kjøre dem parallelt:

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

Til slutt vil vi tilpasse frontend-HTML-ene for å ha en tittel som Spring OAuth Client Thymeleaf - 2 i stedet for – 1 slik at vi kan skille mellom de to.

5. Testing av SSO-atferd

For å teste SSO-oppførsel, la oss kjøre applikasjonene våre.

Vi trenger alle våre 4 oppstartsapper - autorisasjonsserveren, ressursserveren og begge klientapplikasjonene - for å være i gang for dette.

La oss nå åpne en nettleser, si Chrome, og logge på Client-1 bruker legitimasjonen [e-postbeskyttet] / 123. Deretter, i et annet vindu eller en fane, trykker du på URL for Klient-2. Når du klikker på påloggingsknappen, blir vi omdirigert til Foos siden med en gang, utenom autentiseringstrinnet.

Tilsvarende hvis brukeren logger på Klient-2 først trenger de ikke å oppgi brukernavn / passord for Client-1.

6. Konklusjon

I denne veiledningen fokuserte vi på å implementere Single Sign-On ved hjelp av Spring Security OAuth2 og Spring Boot ved hjelp av Keycloak som identitetsleverandør.

Som alltid kan hele kildekoden finnes på GitHub.


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