Eine Kurzanleitung zur Verwendung von Keycloak mit Spring Boot

Eine Kurzanleitung zur Verwendung von Keycloak mit Spring Boot

1. Überblick

In diesem Artikel werden die Grundlagen zum Einrichten eines Keycloak-Servers, die Verwendung vonconnect a Spring Boot application und die Verwendung mit Spring Security erläutert.

2. Was ist Schlüsselumhang?

Keycloak ist eine Open-Source-Lösung für das Identitäts- und Zugriffsmanagement, die auf moderne Anwendungen und Dienste ausgerichtet ist.

Keycloak bietet Funktionen wie Single-Sign-On (SSO), Identity Brokering und soziale Anmeldung, Benutzerföderation, Clientadapter, eine Admin-Konsole und eine Kontoverwaltungskonsole. Um mehr über Keycloak zu erfahren, besuchen Sie bitte dieofficial page.

In unserem Tutorial verwenden wir die Admin-Konsole von Keycloak zum Einrichten und anschließenden Herstellen einer Verbindung mit Spring Boot mithilfe des Keycloak-Clientadapters.

3. Einrichten eines Keycloak-Servers

3.1. Keycloak herunterladen und installieren

Es stehen mehrere Distributionen zur Auswahl.

In diesem Tutorial verwenden wir jedoch die eigenständige Version.

Laden SieKeycloak-3.3.0.Final Standalone server distribution von der offiziellen Quelle herunter.

Sobald wir die Standalone-Server-Distribution heruntergeladen haben, können wir Keycloak vom Terminal aus entpacken und starten:

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

Nach dem Ausführen von./standalone.sh startet Keycloak seine Dienste. Sobald eine Zeile mitKeycloak 3.3.0.Final (WildFly Core 3.0.1.Final) gestartet ist, wissen wir, dass der Startvorgang abgeschlossen ist.

Öffnen Sie einen Browser und besuchen Siehttp://localhost:8180.. Wir werden zuhttp://localhost:8180/auth umgeleitet, um ein Administrator-Login zu erstellen:

image

Erstellen wir einen Benutzer mit dem Namen "initial1" mit dem Kennwort "zaq1!QAZ".

Wir sehen jetzt “Welcome to Keycloak”:

image

Wir können jetzt zur Administrationskonsole übergehen.

3.2. Ein Reich erschaffen

Lassen Sie uns mit der Maus in die obere linke obere Ecke navigieren, um die Schaltfläche“Create a Realm” zu entdecken:

image

Wir nennen es "SpringBootKeycloak":

image

3.3. Erstellen eines Clients

Jetzt navigieren wir zur Seite "Kunden". Wie wir im Bild unten sehen können, istKeycloak comes with Clients that are already built in:

image

Wir müssen unserer Anwendung jedoch einen Client hinzufügen, also klicken wir auf "Erstellen". Wir nennen den neuen Client "login-app":

image

Im nächsten Bildschirm belassen wir für dieses Lernprogramm alle Standardeinstellungen mit Ausnahme des Felds "Gültige Umleitungs-URIs". Wir werden zu Port8081 umgeleitet:

image

3.4. Erstellen einer Rolle und eines Benutzers

Keycloak verwendet den rollenbasierten Zugriff. Daher muss jeder Benutzer eine Rolle haben.

Wir müssen zur Seite "Rolle" navigieren:

image

Dann fügen wir die Rolle "user" hinzu:

image

Jetzt haben wir eine Rolle, die Benutzern zugewiesen werden kann, aber es gibt noch keine Benutzer. Gehen wir also zur Seite "Benutzer" und fügen eine hinzu:

image

Wir fügen den Benutzer“user1”: hinzu

image

Sobald der Benutzer erstellt wurde, wird folgende Seite angezeigt:

image

Wir können jetzt zur Registerkarte "Anmeldeinformationen" gehen. Wir setzen das Passwort auf "[email protected]”:

image

Wir navigieren zur Registerkarte "Rollenzuordnungen". Wir weisen die Benutzerrolle zu:

image

3.5. Erstellen einer benutzerdefinierten Anmeldeseite

Keycloak bietet eine REST-API zum Generieren und Aktualisieren von Zugriffstoken. Mit dieser API können wir problemlos unsere eigene Anmeldeseite erstellen.

Zuerst müssen wir ein Zugriffstoken von Keycloak erhalten, indem wir eine POST-Anfrage an diese URL senden:

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

Die Anfrage sollte diesen JSON-Body haben:

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

Als Antwort erhalten wir einaccess_token und einrefresh_token.

Das Zugriffstoken sollte bei jeder Anforderung an eine durch Keycloak geschützte Ressource verwendet werden, indem es einfach in den Header vonAuthorizationeingefügt wird:

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

Sobald das Zugriffstoken abgelaufen ist, können wir es aktualisieren, indem wir eine POST-Anforderung an dieselbe URL wie oben senden, die jedoch das Aktualisierungstoken anstelle von Benutzername und Kennwort enthält:

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

Dies wird mit neuenaccess_token undrefresh_token. beantwortet

4. Erstellen einer Spring Boot-Anwendung

4.1. Abhängigkeiten

Die neuesten Spring Boot Keycloak Starter-Abhängigkeiten finden Sie inon Maven Central.

The Keycloak Spring Boot adaptercapitalizes on Spring Boot’s auto-configuration, also müssen wir nur den Keycloak Spring Boot-Starter zu unserem Projekt hinzufügen.

Innerhalb des XML-Elements "dependencies" benötigen wir Folgendes, um Keycloak mit Spring Boot auszuführen:


    org.keycloak
    keycloak-spring-boot-starter

Nach dem XML-Element für Abhängigkeiten müssen wirdependencyManagement für Keycloak angeben:


    
        
            org.keycloak.bom
            keycloak-adapter-bom
            3.3.0.Final
            pom
            import
        
    

Die folgenden eingebetteten Container werden jetzt unterstützt und erfordern keine zusätzlichen Abhängigkeiten, wenn Sie Spring Boot Keycloak Starter verwenden:

  • Kater

  • Sog

  • Anlegesteg

4.2. Thymeleaf Webseiten

Wir verwenden Thymeleaf für unsere Webseiten.

Wir haben drei Seiten:

  • external.html –ist eine nach außen gerichtete Webseite für die Öffentlichkeit

  • customers.html - Eine nach innen gerichtete Seite, deren Zugriff nur auf authentifizierte Benutzer mit der Rolle "Benutzer" beschränkt ist.

  • layout.html - Ein einfaches Layout, das aus zwei Fragmenten besteht und sowohl für die nach außen gerichtete Seite als auch für die nach innen gerichtete Seite verwendet wird

Der Code für die Thymeleaf-Vorlagen lautetavailable on Github.

4.3. Regler

Der Web-Controller ordnet die internen und externen URLs den entsprechenden Thymeleaf-Vorlagen zu:

@GetMapping(path = "/")
public String index() {
    return "external";
}

@GetMapping(path = "/customers")
public String customers(Model model) {
    addCustomers();
    model.addAttribute("customers", customerDAO.findAll());
    return "customers";
}

Für den Pfad/customers rufen wir alle Kunden aus einem Repository ab und fügen das Ergebnis als Attribut zuModel hinzu. Später durchlaufen wir die Ergebnisse in Thymeleaf.

4.4. Schlüsselumhangkonfiguration

Hier ist die grundlegende, obligatorische Konfiguration:

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

Wie wir uns erinnern, haben wir Keycloak an Port8180 gestartet, daher der inkeycloak.auth-server-url angegebene Pfad. Wir geben den von uns erstellten Bereichsnamen in die Keycloak-Administratorkonsole ein.

Der inkeycloak.resource angegebene Wert entspricht dem in der Administratorkonsole angegebenen Client.

Hier sind die Sicherheitsbeschränkungen, die wir verwenden werden:

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

Die oben genannten Sicherheitsbeschränkungen stellen sicher, dass jede Anforderung an/customers/* nur autorisiert wird, wenn derjenige, der dies anfordert, ein authentifizierter Benutzer mit der Rolle "Benutzer" ist.

4.5. Demonstration

Jetzt können wir unsere Anwendung testen. Um eine Spring Boot-Anwendung auszuführen, können wir sie einfach über eine IDE wie Spring Tool Suite (STS) starten oder den folgenden Befehl im Terminal ausführen:

mvn clean spring-boot:run

Wir besuchenlocalhost:8081:

image

Jetzt klicken wir auf "customers", um das Intranet aufzurufen, in dem sich vertrauliche Informationen befinden.

Wir können sehen, dass wir zur Authentifizierung über Keycloak umgeleitet wurden, um festzustellen, ob wir zum Anzeigen dieses Inhalts berechtigt sind:

image

Sobald wir uns authentifiziert haben und unsere Autorisierung von Keycloak überprüft wurde, werden wir auf die Seite mit den eingeschränkten Kunden weitergeleitet:

image

Jetzt haben wir die Einrichtung zum Verbinden von Spring Boot mit Keycloak abgeschlossen und demonstriert, wie es funktioniert.

Jetzt werden wir überprüfen, wie Spring Security in Verbindung mit unserer vorhandenen Anwendung verwendet wird.

5. Frühling Sicherheit

Es gibt einen Keycloak Spring-Sicherheitsadapter mitalready included in our Spring Boot Keycloak Starter dependency. Wir werden nun sehen, wie Spring Security in Keycloak integriert wird.

5.1. Abhängigkeit

Um Spring Security mit Spring Boot zu verwenden, müssen wir diese Abhängigkeit hinzufügen:


    org.springframework.boot
    spring-boot-starter-security
    1.5.3

Die neueste Version von Spring Boot Starter Security finden Sie unteron Maven Central.

5.2. Konfigurationsklasse

Keycloak bietet einKeycloakWebSecurityConfigurerAdapter als praktische Basisklasse zum Erstellen einerWebSecurityConfigurer-Instanz. Dies ist praktisch, da für jede durch Spring Security gesicherte Anwendung eine Konfigurationsklasse mit einer Erweiterung vonWebSecurityConfigurerAdapter erforderlich ist:

@Configuration
@EnableWebSecurity
@ComponentScan(basePackageClasses = KeycloakSecurityComponents.class)
class SecurityConfig extends KeycloakWebSecurityConfigurerAdapter {

    @Autowired
    public void configureGlobal(
      AuthenticationManagerBuilder auth) throws Exception {

        KeycloakAuthenticationProvider keycloakAuthenticationProvider
         = keycloakAuthenticationProvider();
        keycloakAuthenticationProvider.setGrantedAuthoritiesMapper(
          new SimpleAuthorityMapper());
        auth.authenticationProvider(keycloakAuthenticationProvider);
    }

    @Bean
    public KeycloakSpringBootConfigResolver KeycloakConfigResolver() {
        return new KeycloakSpringBootConfigResolver();
    }

    @Bean
    @Override
    protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {
        return new RegisterSessionAuthenticationStrategy(
          new SessionRegistryImpl());
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        super.configure(http);
        http.authorizeRequests()
          .antMatchers("/customers*")
          .hasRole("user")
          .anyRequest()
          .permitAll();
    }
}

Bitte beachten Sie den obigen Code:

  • configureGlobal: Aufgaben derSimpleAuthorityMapper, um sicherzustellen, dass den Rollen nichtROLE_ vorangestellt wird

  • keycloakConfigResolver: Dies definiert, dass die Unterstützung der Spring Boot-Eigenschaftendatei anstelle der Standard-keycloak.json verwendet werden soll

5.3. application.properties

Da wir die Sicherheitsbeschränkungen mit Spring Security eingerichtet haben, können wir die vorherigen Sicherheitsbeschränkungen inapplication.properties entfernen.

Jetzt fügen wir dies zu unserenapplication.properties hinzu:

keycloak.principal-attribute=preferred_username

5.4. Regler

Um den Benutzernamen eines Benutzers zu verwenden, aktualisieren wir unseren Controller, um diePrincipal einzufügen:

@GetMapping(path = "/customers")
public String customers(Principal principal, Model model){
    addCustomers();
    model.addAttribute("customers", customerDAO.findAll());
    model.addAttribute("username", principal.getName());
    return "customers";
}

5.5. Thymeleaf

Unter dem div-Container fügen wir diese eine Zeile hinzu, um den Benutzer zu begrüßen:

Hello, --name--.

5.6. Demo

Nachdem wir uns authentifiziert und zur internen Kundenseite weitergeleitet haben, sehen wir Folgendes:

image

6 Fazit

In diesem Lernprogramm haben wir einen Keycloak-Server konfiguriert und mit einer Spring Boot-Anwendung verwendet.

Wir haben auch gesehen, wie Sie Spring Security einrichten und in Verbindung mit Keycloak verwenden. Eine funktionierende Version des in diesem Artikel gezeigten Codes istover on Github verfügbar.