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-app
spring.security.oauth2.client.registration.keycloak.client-secret=my-secret
spring.security.oauth2.client.registration.keycloak.authorization-grant-type=authorization_code
spring.security.oauth2.client.registration.keycloak.redirect-uri-template=http://localhost:8080/login/oauth2/code/keycloak
spring.security.oauth2.client.provider.keycloak.token-uri=${keycloak.auth-server-url}/realms/my-realm/protocol/openid-connect/token
spring.security.oauth2.client.provider.keycloak.user-info-uri=${keycloak.auth-server-url}/realms/my-realm/protocol/openid-connect/userinfo
spring.security.oauth2.client.provider.keycloak.jwk-set-uri=${keycloak.auth-server-url}/realms/my-realm/protocol/openid-connect/certs
spring.security.oauth2.client.registration.keycloak.scope=openid,profile,email
spring.security.oauth2.client.registration.keycloak.client-name=my-app
Sicherheitseinstellungen 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;
@Configuration
public class SecurityConfig {
@Bean
public 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);
}
@Bean
public OidcUserService oidcUserService() {
OidcUserService oidcUserService = new OidcUserService();
oidcUserService.setIdTokenClaimNames(IdTokenClaimNames.SUB, IdTokenClaimNames.PREFERRED_USERNAME);
return oidcUserService;
}
@Bean
public SimpleAuthorityMapper authorityMapper() {
return new SimpleAuthorityMapper();
}
@Configuration
public class OAuth2LoginConfig extends SecurityConfigurerAdapter<DefaultSecurityFilterChain, HttpSecurity> {
@Override
public 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