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.