Kratki vodič za upotrebu ogrtača za ključeve s proljetnim čizmama

1. Pregled

U ovom ćemo članku pokriti osnove postavljanje poslužitelja Keycloak, kako na njega povezati Spring Boot aplikaciju i kako ga koristiti s Spring Security.

2. Što je Keycloak?

Keycloak je rješenje za upravljanje identitetom i pristupom otvorenog koda usmjereno prema modernim aplikacijama i uslugama.

Keycloak nudi značajke kao što su Jednokratna prijava (SSO), Posredovanje identiteta i Društvena prijava, Udruženje korisnika, Klijentski adapteri, Administratorska konzola i Konzola za upravljanje računima. Da biste saznali više o Keycloak-u, posjetite službenu stranicu.

U našem uputstvu koristit ćemo Admin Console za Keycloak za postavljanje, a zatim povezivanje s Spring Bootom pomoću klijentskog adaptera Keycloak.

3. Postavljanje poslužitelja Keycloak

3.1. Preuzimanje i instaliranje Keycloak-a

Možete odabrati nekoliko distribucija.

Međutim, u ovom uputstvu koristit ćemo samostalnu verziju.

Preuzmimo distribuciju samostalnog poslužitelja Keycloak-11.0.2 iz službenog izvora.

Nakon što preuzmemo distribuciju samostalnog poslužitelja, možemo raspakirati i pokrenuti Keycloak s terminala:

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

Nakon trčanja ./standalone.sh, Keycloak će započeti svoje usluge. Jednom kad vidimo redak koji sadrži Ogrtač za ključeve 11.0.2 (WildFly Core 12.0.3.Final) je pokrenut, znat ćemo da je njegovo pokretanje dovršeno.

A sada otvorimo preglednik i posjetimo // localhost: 8180. Bit ćemo preusmjereni na // localhost: 8180 / auth za stvaranje administrativne prijave:

Stvorimo početnog administratora s imenom početni1 s lozinkom zaq1! QAZ. Klikom na Stvoriti, vidjet ćemo poruku Korisnik stvorio.

Sada možemo prijeći na Upravnu konzolu. Na stranici za prijavu unijet ćemo početne vjerodajnice administratora:

3.2. Stvaranje carstva

Uspješna prijava odvest će nas na konzolu i otvoriti zadani Ovladati; majstorski carstvo za nas.

Ovdje ćemo se usredotočiti na stvaranje prilagođenog carstva.

Idemo do gornjeg lijevog gornjeg kuta otkriti Dodaj carstvo dugme:

Na sljedećem zaslonu, dodajmo novo carstvo zvano SpringBootKeycloak:

Nakon klika na Stvoriti gumb, stvorit će se novo područje i mi ćemo biti preusmjereni na njega. Sve operacije u sljedećim odjeljcima izvest će se u ovom novom SpringBootKeycloak carstvo.

3.3. Stvaranje klijenta

Sada ćemo prijeći na stranicu Klijenti. Kao što možemo vidjeti na donjoj slici, Keycloak dolazi s klijentima koji su već ugrađeni:

Ali u našu aplikaciju moramo dodati novog klijenta, pa ćemo kliknuti Stvoriti. Nazvat ćemo novog klijenta prijava-aplikacija:

Na sljedećem ćemo zaslonu, za ovaj vodič, napustiti sve zadane vrijednosti osim the Važeći URI-ovi za preusmjeravanje polje. Ovo polje treba sadržavati URL-ove aplikacije koji će koristiti ovaj klijent za provjeru autentičnosti:

Kasnije ćemo stvoriti Spring Boot Application koji se izvodi na portu 8081 koji će koristiti ovaj klijent. Stoga smo koristili URL za preusmjeravanje // localhost: 8081 /* gore.

3.4. Stvaranje uloge i korisnika

Keycloak koristi pristup zasnovan na ulogama. Stoga svaki korisnik mora imati svoju ulogu.

Da bismo to učinili, trebamo prijeći na Uloge stranica:

Zatim ćemo dodati korisnik uloga:

Sad imamo ulogu koja se može dodijeliti korisnicima, ali još nema korisnika. Pa krenimo Korisnici stranicu i dodajte jednu:

Dodat ćemo korisnika s imenom user1:

Jednom kada je korisnik stvoren, prikazat će se stranica s njegovim detaljima:

Sada možemo ići na Vjerodajnice tab. Početnu lozinku postavit ćemo na [e-pošta zaštićena]:

Napokon ćemo prijeći na Mapiranja uloga tab. Dodijelit ćemo korisnik uloga našem korisnik1:

4. Generiranje pristupnih tokena s API-jem Keycloak-a

Keycloak pruža REST API za generiranje i osvježavanje pristupnih tokena. Ovaj API možemo lako koristiti za stvaranje vlastite stranice za prijavu.

Prvo, moramo dobiti pristupni token od Keycloak-a slanjem POST zahtjeva na ovaj URL:

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

Zahtjev bi trebao imati ovo JSON tijelo:

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

Kao odgovor dobit ćemo pristupni_token i a refresh_token.

Token za pristup trebao bi se koristiti u svakom zahtjevu za resurs zaštićen Keycloakom jednostavnim stavljanjem u Ovlaštenje Zaglavlje:

zaglavlja: {'Autorizacija': 'Donositelj' + access_token}

Nakon što je pristupni token istekao, možemo ga osvježiti slanjem POST zahtjeva na isti URL kao i gore, ali koji sadrži token za osvježavanje umjesto korisničkog imena i lozinke:

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

Keycloak će na to odgovoriti novim pristupni_token i refresh_token.

5. Stvaranje Spring Boot Application

5.1. Ovisnosti

Najnovije ovisnosti o pokretaču Spring Boot Keycloak Starter možete pronaći na Maven Central.

Adapter za oprugu Keycloak Springiskorištava automatsku konfiguraciju Spring Boota, pa sve što trebamo učiniti je dodati naš pokretač Spring Boot Keycloak.

Unutar XML elementa ovisnosti, za pokretanje Keycloak-a s Spring Boot-om potrebno nam je sljedeće:

 org.keycloak keycloak-spring-boot-starter 

Nakon XML elementa ovisnosti, trebamo navesti ovisnostUpravljanje za Keycloak:

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

Sljedeći ugrađeni spremnici su sada podržani i ne zahtijevaju nikakve dodatne ovisnosti ako se koristi Spring Boot Keycloak Starter:

  • Mačak
  • Undertow
  • Brana

5.2. Web stranice majčine dušice

Za naše web stranice koristimo Thymeleaf.

Imamo tri stranice:

  • external.html - vanjska web stranica za javnost
  • kupci.html - interno okrenuta stranica kojoj će pristup biti ograničen samo na ovjerene korisnike s ulogom korisnik.
  • izgled.html - jednostavan izgled, koji se sastoji od dva ulomka, koji se koristi i za vanjsku i za unutarnju stranicu

Kôd za predloške Thymeleaf dostupan je na Githubu.

5.3. Kontroler

Web kontroler preslikava unutarnje i vanjske URL-ove na odgovarajuće predloške Thymeleaf:

@GetMapping (path = "/") javni indeks niza () {return "external"; } @GetMapping (path = "/ customers") javni niz kupaca (glavni nalogodavac, model modela) {addCustomers (); model.addAttribute ("kupci", customerDAO.findAll ()); model.addAttribute ("korisničko ime", principal.getName ()); vratiti "kupce"; }

Za put / kupci, dohvaćamo sve kupce iz spremišta i dodajemo rezultat kao atribut u Model. Kasnije ponavljamo rezultate u timileafu.

Da bismo mogli prikazati korisničko ime, ubrizgavamo Glavni također.

Imajte na umu da ovdje koristimo kupca samo kao sirove podatke za prikaz i ništa više.

5.4. Konfiguracija ogrtača

Evo osnovna, obavezna konfiguracija:

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

Podsjećamo, Keycloak smo pokrenuli u luci 8180, dakle put naveden u keycloak.auth-server-url. Ime carstva koje smo stvorili upisujemo u administratorsku konzolu Keycloak.

Vrijednost koju specificiramo u ogrtač za ključeve.izvor odgovara klijentu kojeg smo imenovali u administratorskoj konzoli.

Evo sigurnosnih ograničenja koja ćemo koristiti:

keycloak.security-constraints [0] .authRoles [0] = user keycloak.security-constraints [0] .securityCollections [0] .patterns [0] = / kupci / *

Ova ograničenja osiguravaju da svaki zahtjev za / kupci / * bit će ovlašten samo ako je onaj tko to zahtijeva ovjereni korisnik s ulogom korisnik.

Dodatno, možemo definirati ogrtač za ključeve.principal-atribut kao preferirano_korisnicko ime kako bi popunili naše kontrolere Glavni s pravim korisnikom:

keycloak.principal-attribute = preferirano_korisničko ime

5.5. Demonstracija

Sada smo spremni testirati našu aplikaciju. Da bismo pokrenuli aplikaciju Spring Boot, možemo je lako pokrenuti putem IDE-a poput Spring Tool Suite (STS) ili pokrenuti ovu naredbu u terminalu:

mvn clean spring-boot: trčanje

U posjetu // localhost: 8081 mi vidimo:

Sad kliknemo kupci za ulazak u intranet, na kojem se nalaze osjetljivi podaci.

Vidimo da smo preusmjereni na autentifikaciju putem Keycloak-a kako bismo provjerili jesmo li ovlašteni za pregled ovog sadržaja:

Jednom kada se prijavimo kao korisnik1, Keycloak će provjeriti naše ovlaštenje - da imamo korisnik ulogu - i bit ćemo preusmjereni na ograničeni kupci stranica:

Sada smo završili postavljanje povezivanja Spring Boota s Keycloakom i demonstrirali kako to radi.

Kao što vidimo, cjelokupnim pozivom Keycloak Autorizacijskog poslužitelja bez problema se bavio Spring Boot za nas. Nismo morali nazvati API Keycloak da bismo sami generirali token pristupa ili čak izričito poslali zaglavlje Autorizacije u našem zahtjevu za zaštićenim resursima.

Dalje ćemo pregledati kako koristiti Spring Security zajedno s našom postojećom aplikacijom.

6. Proljetna sigurnost

Postoji sigurnosni adapter za oprugu Keycloak, i to je već uključen u našu ovisnost o pokretaču Spring Boot Keycloak. Sad ćemo vidjeti kako integrirati Spring Security s Keycloakom.

6.1. Ovisnost

Da bismo koristili Spring Security s Spring Boot, moramo dodati ovu ovisnost:

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

Najnovije izdanje Spring Boot Starter Security možete pronaći na Maven Central.

6.2. Klasa konfiguracije

Ogrtač za ključeve pruža a KeycloakWebSecurityConfigurerAdapter kao prikladna osnovna klasa za stvaranje a WebSecurityConfigurer primjer.

To je korisno jer svaka aplikacija zaštićena Spring Securityom zahtijeva klasu konfiguracije koja se proširuje WebSecurityConfigurerAdapter:

@Configuration @EnableWebSecurity @ComponentScan (basePackageClasses = KeycloakSecurityComponents.class) class SecurityConfig proširuje KeycloakWebSecurityConfigurerAdapter {@Autowired public void configureGlobal (AuthenticationManagerBokilderClovekPackAvterPackAvterPackAvterPackAutherPackAvterPackAvterPackAvterPackAutherPackAvter keycloakAuthenticationProvider.setGrantedAuthoritiesMapper (novi SimpleAuthorityMapper ()); auth.authenticationProvider (keycloakAuthenticationProvider); } @Bean public KeycloakSpringBootConfigResolver KeycloakConfigResolver () {return new KeycloakSpringBootConfigResolver (); } @Bean @Override zaštićeni SessionAuthenticationStrategy sessionAuthenticationStrategy () {vratiti novi RegisterSessionAuthenticationStrategy (novi SessionRegistryImpl ()); } @Override zaštićena void konfiguracija (HttpSecurity http) baca iznimku {super.configure (http); http.authorizeRequests () .antMatchers ("/ kupci *") .hasRole ("korisnik") .anyRequest () .permitAll (); }}

U gornjem kodu, metoda configureGlobal () zadaci SimpleAuthorityMapper kako bi bili sigurni da uloge nemaju prefiks ULOGA_.

Druga metoda, keycloakConfigResolver definira da želimo koristiti zadanu datoteku svojstava Spring Boot umjesto zadane ogrtač za ključeve.json.

Budući da smo sigurnosna ograničenja postavili s Spring Security, možemo ukloniti ili komentirati ova sigurnosna ograničenja koja smo ranije postavili u datoteci svojstava:

# keycloak.security-constraints [0] .authRoles [0] = user # keycloak.security-constraints [0] .securityCollections [0] .patterns [0] = / kupci / *

Sada, nakon što provjerimo autentičnost, moći ćemo pristupiti internoj stranici kupaca, kao što smo vidjeli i prije.

7. Zaključak

U ovom uputstvu konfigurirali smo poslužitelj Keycloak i koristili ga s Spring Boot Application.

Također smo vidjeli kako postaviti Spring Security i koristiti ga zajedno s Keycloakom. Radna verzija koda prikazana u ovom članku dostupna je na Githubu.