SSO und Keycloak als IAM in Anwendungen
Effizientes Identitäts- und Zugriffsmanagement mit Keycloak: Vereinfachen Sie die Authentifizierung in Ihren Anwendungen und steigern Sie die Sicherheit

Keycloak ist eine Open-Source-Software für die Identitäts- und Zugriffsverwaltung (IAM). Es ermöglicht die Umsetzung von Single Sign-On (SSO) in Anwendungen und Diensten. Benutzer können mit Keycloak eine Vielzahl von Anwendungen und Diensten authentifizieren, ohne sich mehrmals anzumelden.
Es gibt eine Verbindung zwischen SSO und Keycloak darin, dass Keycloak als IAM-Lösung verwendet wird, um SSO in einer Anwendungslandschaft zu implementieren:
- Die Einrichtung von Keycloak beginnt mit der Konfiguration und Einrichtung. Dies umfasst die Definition von Benutzern, Rollen, Gruppen und Anwendungen, die von SSO profitieren sollen.
- Integration in Anwendungen: Die Anwendungen und Dienste, die SSO unterstützen sollen, werden so konfiguriert, dass Keycloak als Authentifizierungsdienst verwendet wird. Die Verwendung von Keycloak-Client-Adaptern oder -Bibliotheken kann dies ermöglichen.
- Wenn ein Benutzer eine der SSO-fähigen Anwendungen nutzen möchte, wird er zur Keycloak-Anmeldeseite weitergeleitet. Der Benutzer gibt dort seine Anmeldedaten ein.
- SSO-Token: Keycloak erstellt nach erfolgreicher Anmeldung ein SSO-Token, der alle Informationen über den Benutzer und seine Berechtigungen enthält. Die Anwendung erhält diesen Token zurück.
- Zugriff auf Anwendungen: Die Anwendung verwendet das SSO-Token, das der Benutzer erhält, um seine Berechtigungen zu überprüfen. Der Benutzer kann nun die Anwendung nutzen, ohne sich erneut anzumelden.
- Single Sign-Out: Da alle denselben SSO-Token-Server verwenden, wird der Benutzer, der sich von einer der SSO-fähigen Anwendungen abmeldet, auch von allen anderen abgemeldet.
Die Verwendung von Keycloak bietet gleichzeitig Sicherheitsfunktionen wie die Möglichkeit zur Zwei-Faktor-Authentifizierung, die Verwaltung von Benutzerzugriffsrechten und andere Funktionen, die die Implementierung von SSO erheblich erleichtern. Es ist eine effektive Lösung für das Identitäts- und Zugriffsmanagement in einer Vielzahl von Situationen, insbesondere in komplexen Umgebungen.
Hier ist ein einfaches Konfigurationsbeispiel für die Integration von Keycloak in eine Anwendung, um Single Sign-On (SSO) zu ermöglichen. Da Spring Boot und Spring Security mit Keycloak gut integriert sind, werde ich in diesem Beispiel eine Java-Anwendung verwenden, die mit der Spring Security-Bibliothek entwickelt wurde.
Keycloak-Setup
Installation und konfigurieration von Keycloak nach Bedarf - Realm, Clients, Benutzer und Rollen sollen ordnungsgemäß eingerichtet.
Quelle: thomasvitale.comKonfiguration der Spring Boot-Anwendung
Erforderlichen Abhängigkeiten zu
build.gradle(Gradle) oderpom.xml(Maven); einschließlich Spring Boot, Spring Security und Keycloak.In Gradle:
dependencies {implementation 'org.springframework.boot:spring-boot-starter-security'implementation 'org.keycloak:keycloak-spring-boot-starter'// Weitere Abhängigkeiten nach Bedarf}Spring Boot-Anwendung Konfiguration, um Keycloak zu verwenden. Eine Datei namens
application.properties(oderapplication.yml) soll erstellt werden dort die Keycloak-Konfigurationsdetails hinzufügen.spring.security.oauth2.client.registration.keycloak.client-id=my-appspring.security.oauth2.client.registration.keycloak.client-secret=my-secretspring.security.oauth2.client.registration.keycloak.authorization-grant-type=authorization_codespring.security.oauth2.client.registration.keycloak.redirect-uri-template=http://localhost:8080/login/oauth2/code/keycloakspring.security.oauth2.client.provider.keycloak.token-uri=${keycloak.auth-server-url}/realms/my-realm/protocol/openid-connect/tokenspring.security.oauth2.client.provider.keycloak.user-info-uri=${keycloak.auth-server-url}/realms/my-realm/protocol/openid-connect/userinfospring.security.oauth2.client.provider.keycloak.jwk-set-uri=${keycloak.auth-server-url}/realms/my-realm/protocol/openid-connect/certsspring.security.oauth2.client.registration.keycloak.scope=openid,profile,emailspring.security.oauth2.client.registration.keycloak.client-name=my-appSicherheitseinstellungen festlegen
Spring Security sollte so konfiguriert werden, dass Keycloak als Authentifizierungsanbieter verwendet wird. Dazu sollte die folgende Konfigurationsklasse erstellt werden. Diese kann je nach Bedarf natürlich erweitert werden.
import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.security.config.annotation.web.builders.HttpSecurity;import org.springframework.security.core.authority.mapping.SimpleAuthorityMapper;import org.springframework.security.oauth2.client.oidc.authentication.OidcIdTokenDecoderFactory;import org.springframework.security.oauth2.client.oidc.authentication.OidcUserService;import org.springframework.security.oauth2.client.registration.ClientRegistration;import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository;import org.springframework.security.oauth2.client.registration.InMemoryClientRegistrationRepository;import org.springframework.security.oauth2.core.oidc.IdTokenClaimNames;@Configurationpublic class SecurityConfig {@Beanpublic ClientRegistrationRepository clientRegistrationRepository() {ClientRegistration registration = ClientRegistration.withRegistrationId("keycloak").clientId("my-app").clientSecret("my-secret").authorizationGrantType("authorization_code").redirectUriTemplate("{baseUrl}/login/oauth2/code/{registrationId}").scope("openid", "profile", "email").authorizationUri("http://localhost:8080/auth/realms/my-realm/protocol/openid-connect/auth").tokenUri("http://localhost:8080/auth/realms/my-realm/protocol/openid-connect/token").userInfoUri("http://localhost:8080/auth/realms/my-realm/protocol/openid-connect/userinfo").jwkSetUri("http://localhost:8080/auth/realms/my-realm/protocol/openid-connect/certs").clientName("my-app").build();return new InMemoryClientRegistrationRepository(registration);}@Beanpublic OidcUserService oidcUserService() {OidcUserService oidcUserService = new OidcUserService();oidcUserService.setIdTokenClaimNames(IdTokenClaimNames.SUB, IdTokenClaimNames.PREFERRED_USERNAME);return oidcUserService;}@Beanpublic SimpleAuthorityMapper authorityMapper() {return new SimpleAuthorityMapper();}@Configurationpublic class OAuth2LoginConfig extends SecurityConfigurerAdapter<DefaultSecurityFilterChain, HttpSecurity> {@Overridepublic void configure(HttpSecurity http) throws Exception {http.authorizeRequests(authorizeRequests ->authorizeRequests.antMatchers("/", "/index.html").permitAll().anyRequest().authenticated()).oauth2Login().userInfoEndpoint().oidcUserService(oidcUserService()).and().loginPage("/login").failureUrl("/login-error").permit
