En hurtigveiledning for bruk av nøkkelring med fjærstøvel

1. Oversikt

I denne artikkelen vil vi dekke det grunnleggende om sette opp en Keycloak-server, hvordan du kobler et Spring Boot-program til det, og hvordan du bruker det med Spring Security.

2. Hva er nøkkelring?

Keycloak er en åpen kildekode Identity and Access Management-løsning rettet mot moderne applikasjoner og tjenester.

Keycloak tilbyr funksjoner som Single-Sign-On (SSO), Identity Brokering and Social Login, User Federation, Client Adapters, en Admin Console og en Account Management Console. For å lære mer om Keycloak, besøk den offisielle siden.

I opplæringen bruker vi Admin Console of Keycloak for å sette opp og deretter koble til Spring Boot ved hjelp av Keycloak Client Adapter.

3. Sette opp en Keycloak-server

3.1. Laste ned og installere Keycloak

Det er flere distribusjoner å velge mellom.

I denne opplæringen bruker vi imidlertid den frittstående versjonen.

La oss laste ned Keycloak-11.0.2 frittstående serverdistribusjon fra den offisielle kilden.

Når vi har lastet ned frittstående serverdistribusjon, kan vi pakke ut og starte Keycloak fra terminalen:

pakke ut keycloak-11.0.2.zip cd keycloak-11.0.2 / bin ./standalone.sh -Djboss.socket.binding.port-offset = 100

Etter å ha løpt ./standalone.sh, Keycloak starter tjenestene. Når vi ser en linje som inneholder Keycloak 11.0.2 (WildFly Core 12.0.3.Final) startet, vi vet at oppstarten er fullført.

La oss nå åpne en nettleser og besøke // lokal vert: 8180. Vi blir omdirigert til // localhost: 8180 / auth for å opprette en administrativ pålogging:

La oss opprette en første administratorbruker som heter initial1 med passordet zaq1! QAZ. Ved å klikke Skape, får vi se en melding Bruker opprettet.

Vi kan nå gå videre til administrasjonskonsollen. På påloggingssiden legger vi inn de første administratorbrukerlegitimasjonene:

3.2. Å skape et rike

En vellykket pålogging tar oss til konsollen og åpner standard Herre riket for oss.

Her vil vi fokusere på å lage et tilpasset rike.

La oss navigere til øvre venstre øvre hjørne å oppdage Legg til rike knapp:

På neste skjermbilde, la oss legge til et nytt rike som heter SpringBootKeycloak:

Etter å ha klikket på Skape knapp, blir et nytt rike opprettet, og vi blir omdirigert til det. Alle operasjonene i de neste avsnittene vil bli utført i denne nye SpringBootKeycloak riket.

3.3. Opprette en klient

Nå navigerer vi til Klientsiden. Som vi kan se på bildet nedenfor, Keycloak kommer med klienter som allerede er innebygd:

Men vi må legge til en ny klient i applikasjonen vår, så vi klikker Skape. Vi ringer til den nye klienten innloggings-app:

I det neste skjermbildet, for denne opplæringen, lar vi alle standardinnstillingene bortsett fra de Gyldige URI-er for omdirigering felt. Dette feltet skal inneholde applikasjons-URL (er) som vil bruke denne klienten til autentisering:

Senere lager vi et Spring Boot-program som kjører i port 8081 som bruker denne klienten. Derfor har vi brukt en viderekoblings-URL på // lokal vert: 8081 /* ovenfor.

3.4. Opprette en rolle og en bruker

Keycloak bruker rollebasert tilgang. Derfor må hver bruker ha en rolle.

For å gjøre det, må vi navigere til Roller side:

Deretter legger vi til bruker rolle:

Nå har vi en rolle som kan tildeles brukere, men det er ingen brukere ennå. Så la oss gå Brukere side og legg til en:

Vi legger til en bruker som heter bruker1:

Når brukeren er opprettet, vises en side med detaljene:

Vi kan nå gå til Legitimasjonserklæring fanen. Vi setter det første passordet til [e-postbeskyttet]:

Til slutt navigerer vi til Rollekartlegginger fanen. Vi tildeler bruker rolle til vår bruker1:

4. Generere tilgangstokener med Keycloaks API

Keycloak tilbyr et REST API for å generere og forfriske tilgangstokener. Vi kan enkelt bruke denne API-en til å lage vår egen påloggingsside.

Først må vi anskaffe et tilgangstoken fra Keycloak ved å sende en POST-forespørsel til denne URL:

// localhost: 8180 / auth / realms / master / protocol / openid-connect / token

Forespørselen skal ha denne JSON-kroppen:

{'client_id': 'your_client_id', 'username': 'your_username', 'password': 'your_password', 'grant_type': 'password'}

Som svar får vi en tilgangstoken og en refresh_token.

Tilgangstokenet skal brukes i hver forespørsel til en Keycloak-beskyttet ressurs ved å bare plassere den i Autorisasjon Overskrift:

overskrifter: {'Authorization': 'Bearer' + access_token}

Når tilgangstokenet er utløpt, kan vi oppdatere det ved å sende en POST-forespørsel til samme URL som ovenfor, men som inneholder oppdateringstokenet i stedet for brukernavn og passord:

{'client_id': 'your_client_id', 'refresh_token': refresh_token_from_previous_request, 'grant_type': 'refresh_token'}

Keycloak vil svare på dette med en ny tilgangstoken og refresh_token.

5. Opprette en Spring Boot-applikasjon

5.1. Avhengigheter

De siste Spring Boot Keycloak Starter-avhengighetene finnes på Maven Central.

Keycloak Spring Boot adapterutnytter Spring Boot sin automatiske konfigurasjon, så alt vi trenger å gjøre er å legge til start på Keycloak Spring Boot i prosjektet vårt.

Innenfor avhengighets-XML-elementet trenger vi følgende for å kjøre Keycloak med Spring Boot:

 org.keycloak keycloak-spring-boot-starter 

Etter XML-elementets avhengighet, må vi spesifisere avhengighetLedelse for Keycloak:

   org.keycloak.bom keycloak-adapter-bom 11.0.2 pom import 

Følgende innebygde containere støttes nå og krever ingen ekstra avhengigheter hvis du bruker Spring Boot Keycloak Starter:

  • Tomcat
  • Undertow
  • Brygge

5.2. Thymeleaf websider

Vi bruker Thymeleaf til websidene våre.

Vi har tre sider:

  • ekstern.html - en utadvendt webside for publikum
  • kunder.html - en internt vendt side som vil ha tilgang begrenset til bare godkjente brukere med rollen bruker.
  • layout.html - en enkel layout, bestående av to fragmenter, som brukes til både den utvendige siden og den innovervendte siden

Koden for Thymeleaf-malene er tilgjengelig på Github.

5.3. Kontroller

Nettkontrolleren tilordner de interne og eksterne URL-ene til de aktuelle Thymeleaf-malene:

@GetMapping (path = "/") offentlig strengindeks () {return "ekstern"; } @GetMapping (sti = "/ kunder") offentlige String-kunder (rektor, modellmodell) {addCustomers (); model.addAttribute ("kunder", customerDAO.findAll ()); model.addAttribute ("brukernavn", principal.getName ()); returnere "kunder"; }

For stien / kunder, vi henter alle kunder fra et depot og legger til resultatet som en attributt til Modell. Senere gjentar vi resultatene i Thymeleaf.

For å kunne vise et brukernavn, injiserer vi Rektor også.

Merk at vi bruker kunden her som rådata å vise, og ikke noe mer.

5.4. Nøkkelloppkonfigurasjon

Her er den grunnleggende, obligatoriske konfigurasjonen:

keycloak.auth-server-url = // localhost: 8180 / auth keycloak.realm = SpringBootKeycloak keycloak.resource = login-app keycloak.public-client = true 

Som vi husker startet vi Keycloak på havn 8180, derav banen spesifisert i keycloak.auth-server-url. Vi skriver inn rikets navn vi opprettet i Keycloak administrasjonskonsoll.

Verdien vi spesifiserer i nøkkelloak.ressurs samsvarer med klienten vi kalte på administrasjonskonsollen.

Her er sikkerhetsbegrensningene vi bruker:

keycloak.security-constraints [0] .authRoles [0] = bruker keycloak.security-constraints [0] .securityCollections [0] .mønstre [0] = / kunder / *

Disse begrensningene sørger for at enhver forespørsel til / kunder / * vil bare bli autorisert hvis den som ber om det, er en godkjent bruker med rollen bruker.

I tillegg kan vi definere keycloak.principal-attribute som foretrukket_brukernavn slik at vi fyller kontrolleren vår Rektor med en skikkelig bruker:

keycloak.principal-attribute = foretrukket_brukernavn

5.5. Demonstrasjon

Nå er vi klare til å teste søknaden vår. For å kjøre et Spring Boot-program kan vi enkelt starte det gjennom en IDE som Spring Tool Suite (STS) eller kjøre denne kommandoen i terminalen:

mvn ren vårstøvel: løp

På besøk // lokal vert: 8081 vi ser:

Nå klikker vi kunder for å komme inn på intranettet, som er plasseringen av sensitiv informasjon.

Vi kan se at vi har blitt omdirigert for å godkjenne gjennom Keycloak for å se om vi har autorisasjon til å se dette innholdet:

Når vi logger inn som bruker1, Keycloak vil bekrefte autorisasjonen vår - at vi har bruker rolle - og vi blir omdirigert til den begrensede kunder side:

Nå er vi ferdig med å koble Spring Boot til Keycloak og demonstrere hvordan det fungerer.

Som vi kan se, hele prosessen med å ringe Keycloak Authorization Server ble håndtert sømløst av Spring Boot for oss. Vi måtte ikke ringe Keycloak API for å generere Access Token selv, eller til og med sende autorisasjonsoverskriften eksplisitt i vår forespørsel om beskyttede ressurser.

Deretter vil vi gjennomgå hvordan du bruker Spring Security i forbindelse med vår eksisterende applikasjon.

6. Vårsikkerhet

Det er en Keycloak Spring Security Adapter, og det er det allerede inkludert i vår Spring Boot Keycloak Starter avhengighet. Vi får nå se hvordan vi kan integrere Spring Security med Keycloak.

6.1. Avhengighet

For å bruke Spring Security med Spring Boot, må vi legge til denne avhengigheten:

 org.springframework.boot spring-boot-starter-security 2.2.6.RELEASE 

Den siste Spring Boot Starter Security-utgivelsen finner du på Maven Central.

6.2. Konfigurasjonsklasse

Keycloak gir en KeycloakWebSecurityConfigurerAdapter som en praktisk basisklasse for å lage en WebSecurityConfigurer forekomst.

Dette er nyttig fordi ethvert program sikret av Spring Security krever en konfigurasjonsklasse som utvides WebSecurityConfigurerAdapter:

@Configuration @EnableWebSecurity @ComponentScan (basePackageClasses = KeycloakSecurityComponents.class) klasse SecurityConfig utvider KeycloakWebSecurityConfigurerAdapter {@Autowired public void configureGlobal (AuthenticationManagerBuilder authenticationAuthenticationProvider) keycloakAuthenticationProvider.setGrantedAuthoritiesMapper (ny SimpleAuthorityMapper ()); auth.authenticationProvider (keycloakAuthenticationProvider); } @Bean public KeycloakSpringBootConfigResolver KeycloakConfigResolver () {return new KeycloakSpringBootConfigResolver (); } @Bean @Override beskyttet SessionAuthenticationStrategy sessionAuthenticationStrategy () {return new RegisterSessionAuthenticationStrategy (new SessionRegistryImpl ()); } @ Override-beskyttet ugyldig konfigurasjon (HttpSecurity http) kaster Unntak {super.configure (http); http.authorizeRequests () .antMatchers ("/ customers *") .hasRole ("user") .anyRequest () .permitAll (); }}

I koden ovenfor, metoden configureGlobal () oppgaver SimpleAuthorityMapper for å sikre at roller ikke er prefiks ROLE_.

En annen metode, keycloakConfigResolver definerer at vi vil bruke Spring Boot egenskaper filstøtte i stedet for standard keycloak.json.

Fordi vi har satt opp sikkerhetsbegrensningene med Spring Security, kan vi fjerne eller kommentere disse sikkerhetsbegrensningene vi hadde plassert tidligere i egenskapsfilen:

# keycloak.security-constraints [0] .authRoles [0] = bruker # keycloak.security-constraints [0] .securityCollections [0] .mønstre [0] = / kunder / *

Nå, etter at vi har godkjent, vil vi få tilgang til de interne kundenes side, den samme som vi så før.

7. Konklusjon

I denne veiledningen har vi konfigurert en Keycloak-server og brukt den med en Spring Boot-applikasjon.

Vi har også sett hvordan du konfigurerer Spring Security og bruker den i forbindelse med Keycloak. En fungerende versjon av koden vist i denne artikkelen er tilgjengelig på Github.


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