Een beknopte handleiding voor het gebruik van Keycloak met Spring Boot

1. Overzicht

In dit artikel bespreken we de basisprincipes van het opzetten van een Keycloak-server, hoe u er een Spring Boot-applicatie op aansluit en hoe u deze gebruikt met Spring Security.

2. Wat is Keycloak?

Keycloak is een open source Identity and Access Management-oplossing gericht op moderne applicaties en services.

Keycloak biedt functies zoals Single-Sign-On (SSO), Identity Brokering en Social Login, User Federation, Client Adapters, een Admin Console en een Account Management Console. Bezoek de officiële pagina voor meer informatie over Keycloak.

In onze tutorial gebruiken we de Admin Console van Keycloak voor het instellen en vervolgens verbinden met Spring Boot met behulp van de Keycloak Client Adapter.

3. Opzetten van een Keycloak Server

3.1. Keycloak downloaden en installeren

Er zijn verschillende distributies om uit te kiezen.

In deze zelfstudie gebruiken we echter de zelfstandige versie.

Laten we de Keycloak-11.0.2 Standalone-serverdistributie downloaden van de officiële bron.

Nadat we de zelfstandige serverdistributie hebben gedownload, kunnen we Keycloak uitpakken en starten vanaf de terminal:

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

Na het rennen ./standalone.shStart Keycloak met haar diensten. Zodra we een regel zien met Keycloak 11.0.2 (WildFly Core 12.0.3.Final) gestart, we weten dat het opstarten is voltooid.

Laten we nu een browser openen en bezoeken // localhost: 8180. We worden doorgestuurd naar // localhost: 8180 / auth om een ​​administratieve login aan te maken:

Laten we een eerste admin-gebruiker maken met de naam initial1 met het wachtwoord zaq1! QAZ. Door te klikken Creëer, we zien een bericht Gebruiker aangemaakt.

We kunnen nu doorgaan naar de beheerconsole. Op de inlogpagina voeren we de oorspronkelijke aanmeldingsgegevens van de beheerder in:

3.2. Een rijk creëren

Een succesvolle login brengt ons naar de console en opent de standaard Meester rijk voor ons.

Hier zullen we ons concentreren op het maken van een aangepast rijk.

Laten we naar de linkerbovenhoek gaan om de Realm toevoegen knop:

Op het volgende scherm laten we een nieuw rijk toevoegen met de naam SpringBootKeycloak:

Nadat u op het Creëer knop, wordt er een nieuw rijk gemaakt en worden we ernaar doorgestuurd. Alle bewerkingen in de volgende secties worden uitgevoerd in deze nieuwe SpringBootKeycloak rijk.

3.3. Een klant aanmaken

Nu gaan we naar de pagina Klanten. Zoals we in de onderstaande afbeelding kunnen zien, Keycloak wordt geleverd met clients die al zijn ingebouwd:

Maar we moeten een nieuwe klant aan onze applicatie toevoegen, dus we klikken Creëer. We bellen de nieuwe klant login-app:

In het volgende scherm laten we voor deze tutorial alle standaardinstellingen staan, behalve de Geldige omleidings-URI's veld. Dit veld moet de applicatie-URL ('s) bevatten die deze client voor authenticatie zullen gebruiken:

Later zullen we een Spring Boot-applicatie maken die draait op poort 8081 die deze client zal gebruiken. Daarom hebben we een omleidings-URL gebruikt van // localhost: 8081 /* bovenstaande.

3.4. Een rol en een gebruiker aanmaken

Keycloak maakt gebruik van Role-Based Access. Daarom moet elke gebruiker een rol hebben.

Om dat te doen, moeten we naar het Rollen bladzijde:

Vervolgens voegen we de gebruiker rol:

Nu hebben we een rol die aan gebruikers kan worden toegewezen, maar er zijn nog geen gebruikers. Dus laten we gaan Gebruikers pagina en voeg er een toe:

We voegen een gebruiker toe met de naam gebruiker1:

Zodra de gebruiker is aangemaakt, wordt een pagina met zijn details weergegeven:

We kunnen nu naar de Inloggegevens tabblad. We zullen het oorspronkelijke wachtwoord instellen op [e-mail beveiligd]:

Ten slotte gaan we naar het Roltoewijzingen tabblad. We zullen de gebruiker rol voor onze gebruiker1:

4. Toegangstokens genereren met de API van Keycloak

Keycloak biedt een REST API voor het genereren en vernieuwen van toegangstokens. We kunnen deze API eenvoudig gebruiken om onze eigen inlogpagina te maken.

Eerst moeten we een toegangstoken van Keycloak verkrijgen door een POST-verzoek naar deze URL te sturen:

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

Het verzoek moet deze JSON-body hebben:

{'client_id': 'uw_client_id', 'gebruikersnaam': 'uw_gebruikersnaam', 'wachtwoord': 'uw_wachtwoord', 'grant_type': 'wachtwoord'}

Als reactie hierop krijgen we een toegangstoken en een refresh_token.

Het toegangstoken moet in elk verzoek aan een door Keycloak beschermde bron worden gebruikt door het simpelweg in de Autorisatie koptekst:

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

Zodra het toegangstoken is verlopen, kunnen we het vernieuwen door een POST-verzoek te sturen naar dezelfde URL als hierboven, maar met het vernieuwingstoken in plaats van de gebruikersnaam en het wachtwoord:

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

Keycloak zal hierop reageren met een nieuwe toegangstoken en refresh_token.

5. Een Spring Boot-applicatie maken

5.1. Afhankelijkheden

De nieuwste afhankelijkheden van Spring Boot Keycloak Starter zijn te vinden op Maven Central.

De Keycloak Spring Boot-adapterprofiteert van de automatische configuratie van Spring Boot, dus alles wat we hoeven te doen is de Keycloak Spring Boot-starter aan ons project toe te voegen.

Binnen het afhankelijkheden XML-element hebben we het volgende nodig om Keycloak met Spring Boot uit te voeren:

 org.keycloak keycloak-spring-boot-starter 

Na het afhankelijkheden XML-element, moeten we specificeren afhankelijkheidsbeheer voor Keycloak:

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

De volgende embedded containers worden nu ondersteund en vereisen geen extra afhankelijkheden als je Spring Boot Keycloak Starter gebruikt:

  • Kater
  • Undertow
  • Steiger

5.2. Thymeleaf-webpagina's

We gebruiken Thymeleaf voor onze webpagina's.

We hebben drie pagina's:

  • extern.html - een extern gerichte webpagina voor het publiek
  • klanten.html - een intern gerichte pagina waarvan de toegang beperkt is tot alleen geauthenticeerde gebruikers met de rol gebruiker.
  • layout.html - een eenvoudige lay-out, bestaande uit twee fragmenten, die wordt gebruikt voor zowel de naar buiten gerichte pagina als de naar binnen gerichte pagina

De code voor de Thymeleaf-sjablonen is beschikbaar op Github.

5.3. Controller

De webcontroller wijst de interne en externe URL's toe aan de juiste Thymeleaf-sjablonen:

@GetMapping (path = "/") public String index () {return "external"; } @GetMapping (path = "/ customers") openbare String-klanten (Principal principal, Model model) {addCustomers (); model.addAttribute ("klanten", customerDAO.findAll ()); model.addAttribute ("gebruikersnaam", principal.getName ()); retourneer "klanten"; }

Voor het pad /klantenhalen we alle klanten op uit een repository en voegen we het resultaat als een attribuut toe aan het Model. Later herhalen we de resultaten in Thymeleaf.

Om een ​​gebruikersnaam weer te geven, injecteren we het Opdrachtgever ook.

Merk op dat we de klant hier net als onbewerkte gegevens gebruiken om weer te geven, en niets meer.

5.4. Keycloak-configuratie

Hier is de verplichte basisconfiguratie:

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

Zoals we ons herinneren, begonnen we Keycloak aan de haven 8180, vandaar het pad dat is opgegeven in keycloak.auth-server-url. We voeren de realm-naam in die we hebben gemaakt in de Keycloak-beheerconsole.

De waarde die we specificeren in keycloak.resource komt overeen met de client die we hebben genoemd in de beheerconsole.

Dit zijn de beveiligingsbeperkingen die we zullen gebruiken:

keycloak.security-constraints [0] .authRoles [0] = gebruiker keycloak.security-constraints [0] .securityCollections [0] .patterns [0] = / klanten / *

Deze beperkingen zorgen ervoor dat elk verzoek om /klanten/* wordt alleen geautoriseerd als degene die erom vraagt ​​een geauthenticeerde gebruiker is met de rol gebruiker.

Bovendien kunnen we definiëren keycloak.principal-attribuut net zo Gewenste gebruikersnaam om die van onze controller te vullen Opdrachtgever met een juiste gebruiker:

keycloak.principal-attribute = voorkeursgebruikersnaam

5.5. Demonstratie

Nu zijn we klaar om onze applicatie te testen. Om een ​​Spring Boot-applicatie uit te voeren, kunnen we deze eenvoudig starten via een IDE zoals Spring Tool Suite (STS) of deze opdracht uitvoeren in de terminal:

mvn clean spring-boot: run

Bij een bezoek // localhost: 8081 wij zien:

Nu klikken we klanten om het intranet te openen, waar gevoelige informatie zich bevindt.

We kunnen zien dat we zijn omgeleid om te authenticeren via Keycloak om te zien of we geautoriseerd zijn om deze inhoud te bekijken:

Zodra we inloggen als gebruiker1, Keycloak zal onze toestemming verifiëren - dat we de gebruiker rol - en we worden doorgestuurd naar het beperkte klanten bladzijde:

Nu zijn we klaar met het opzetten van het verbinden van Spring Boot met Keycloak en hebben we gedemonstreerd hoe het werkt.

Zoals we kunnen zien, het hele proces van het aanroepen van de Keycloak Authorization Server werd naadloos afgehandeld door Spring Boot voor ons. We hoefden de Keycloak API niet aan te roepen om zelf het toegangstoken te genereren, of zelfs de autorisatiekop expliciet te sturen in ons verzoek om beschermde bronnen.

Vervolgens bekijken we hoe u Spring Security kunt gebruiken in combinatie met onze bestaande applicatie.

6. Lente-beveiliging

Er is een Keycloak Spring Security Adapter, en dat is het ook al opgenomen in onze Spring Boot Keycloak Starter-afhankelijkheid. We zullen nu zien hoe u Spring Security integreert met Keycloak.

6.1. Afhankelijkheid

Om Spring Security te gebruiken met Spring Boot, moeten we deze afhankelijkheid toevoegen:

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

De nieuwste Spring Boot Starter Security-release is te vinden op Maven Central.

6.2. Configuratieklasse

Keycloak biedt een KeycloakWebSecurityConfigurerAdapter als een handige basisklasse voor het maken van een WebSecurityConfigurer voorbeeld.

Dit is handig omdat elke toepassing die door Spring Security is beveiligd, een configuratieklasse vereist die uitbreidt WebSecurityConfigurerAdapter:

@Configuration @EnableWebSecurity @ComponentScan (basePackageClasses = KeycloakSecurityComponents.class) klasse SecurityConfig breidt KeycloakWebSecurityConfigurerAdapter {@Autowired public void configureGlobal (AuthenticationManagerBuilder auth) throws = KeycloakWebSecurityConfigurerAdapter uit {@Autowired public void configureGlobal (AuthenticationManagerBuilder auth) throws = ExceptionChenticationProvider). keycloakAuthenticationProvider.setGrantedAuthoritiesMapper (nieuwe SimpleAuthorityMapper ()); auth.authenticationProvider (keycloakAuthenticationProvider); } @Bean openbare KeycloakSpringBootConfigResolver KeycloakConfigResolver () {retourneer nieuwe KeycloakSpringBootConfigResolver (); } @Bean @Override beschermde SessionAuthenticationStrategy sessionAuthenticationStrategy () {retourneer nieuwe RegisterSessionAuthenticationStrategy (nieuwe SessionRegistryImpl ()); } @Override protected void configure (HttpSecurity http) genereert uitzondering {super.configure (http); http.authorizeRequests () .antMatchers ("/ klanten *") .hasRole ("gebruiker") .anyRequest () .permitAll (); }}

In de bovenstaande code is de method configurerenGlobal () taken de SimpleAuthorityMapper om ervoor te zorgen dat rollen niet worden voorafgegaan door ROL_.

Een andere methode, keycloakConfigResolver definieert dat we de Spring Boot-eigenschappenbestandondersteuning willen gebruiken in plaats van de standaard keycloak.json.

Omdat we de beveiligingsbeperkingen met Spring Security hebben ingesteld, kunnen we deze beveiligingsbeperkingen die we eerder in het eigenschappenbestand hadden geplaatst, verwijderen of becommentariëren:

# keycloak.security-constraints [0] .authRoles [0] = gebruiker # keycloak.security-constraints [0] .securityCollections [0] .patterns [0] = / klanten / *

Nu, nadat we ons hebben geverifieerd, hebben we toegang tot de interne klantenpagina, zoals we eerder zagen.

7. Conclusie

In deze tutorial hebben we een Keycloak-server geconfigureerd en deze gebruikt met een Spring Boot-applicatie.

We hebben ook gezien hoe u Spring Security instelt en gebruikt in combinatie met Keycloak. Een werkende versie van de code die in dit artikel wordt getoond, is beschikbaar op Github.


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