Menschen von oben fotografiert, die an einem Tisch sitzen.

adesso Blog

Applikationen enthalten häufig Ressourcen, die nur bestimmten Usern zur Verfügung stehen sollen. Management-Benutzerinnen und -Benutzer administrieren beispielsweise die Informationen ihrer Mitarbeitenden, Sales User wohingegen die Informationen ihrer Kundinnen und Kunden. Das erfordert abgeschlossene Bereiche, auf welche der Zugriff durch Berechtigungen gesteuert wird. Ich möchte euch in diesem Artikel anhand einiger kurzer Beispiele zeigen, wie ihr in Keycloak diese Zugriffsberechtigungen verwaltet und diese Gruppen von Usern zuordnen könnt.

Keycloak ist eine Java-basierte Open-Source-Identity- und Access-Management-Lösung (IAM). IAM-Systeme bieten die Möglichkeit, Identitäten und Zugriffsrechte für verschiedene Anwendungen zu verwalten, und erfüllen dazu zwei Aufgaben:

  • Authentifizierung: Die Identität eines Users wird verifiziert, indem dieser beispielsweise einen Benutzernamen und ein Passwort angibt.
  • Autorisierung: Nachdem die Identität erfolgreich nachgewiesen wurde, werden dem User Berechtigungen gewährt, durch die dieser Zugriff auf seine Ressourcen erhält.

Ich werde im weiteren Verlauf dieses Artikels genauer auf die Autorisierung eingehen. Keycloak ist eine zertifizierte Implementierung des OpenID Connect-Protokolls und eine etablierte Standardlösung, die eine Reihe von Features out of the box zur Verfügung stellt. Dazu gehören unter anderem Single Sign-On, Identity Brokering und Integration von Drittsystemen (zum Beispiel Google, Twitter).

Grundlegende Begrifflichkeiten

Die Grundlage in Keycloak bilden die Begriffe Realm, Client und Role. Jeder Realm verwaltet eine Menge von Benutzerinnen und Benutzern und enthält üblicherweise mehrere Clients. Diese können von einer Anwendung oder einem Backend-Service verwendet werden, um die User des Realms zu authentifizieren. In unserem Beispiel habe ich einen Realm mit dem Namen „Meine-anwendung“ und den Clients „meine-anwendung-webapp“ und „meine-anwendung-api“ angelegt (siehe Abbildung 1). Beispielsweise könnte der Client „meine-anwendung-webapp“ vom Frontend und der Client „meine-anwendung-api“ von Backend-Services verwendet werden.

Roles

Die Autorisierung könnt ihr nun durch Roles steuern. Diese sind einem Typ oder einer Kategorie von Usern (beispielsweise Sales-Mitarbeitende) zuordenbar. Grundsätzlich gibt es drei Arten von Roles:

1. Realm Role: eine globale Role, die in jedem Client verfügbar ist und jedem User zugeordnet werden kann.

2. Client Role: eine Role, die nur in einem bestimmten Client verfügbar und nicht von anderen Clients aus erreichbar ist.

3. Composite Roles: Eine oder mehrere andere Roles sind mit einer Composite Role verknüpft. Benutzerinnen und Benutzer haben auch immer die verknüpften Roles einer Composite Role, der sie zugeordnet sind.

Als Realm Roles eignen sich allgemeine Berechtigungen und als Client Roles feingranularere Berechtigungen, die exklusiv von den einzelnen Clients verwendet werden. In Abbildung 2 ist eine exemplarische Übersicht über mögliche Realm Roles zu sehen.

Absicherung einer Ressource durch Roles

Die definierten Roles könnt ihr nun direkt verwenden, um euer Frontend und eure Backend-Services abzusichern. Anwendungen, die auf HTML5/Javascript basieren, können die Funktionen von Keycloak einfach über einen Javascript-Adapter einbinden. Mit dessen Hilfe könnt ihr einzelne Bereiche eurer Anwendung beispielsweise per Conditional Rendering mit folgender Methode darstellen:

	
	function hatNutzerRole(roleName) {    
		    let keycloak = new Keycloak({
		  url: 'http://localhost/auth',
		 realm: 'Meine-anwendung',        
		clientId: 'meine-anwendung-webapp'    
		 });    
		 return keycloak.hasRealmRole(roleName);
		}
	

Die Absicherung von Bean-Klassen und Methoden in Java ist ähnlich einfach. Per Annotation kann der Zugriff beschränkt oder erlaubt werden:

	
	import javax.annotation.security.*;
		@RolesAllowed("administrator")
		public class Ressource {    
		@RolesAllowed("entwickler")    
		   public void exampleMethod() {        
		 //...    
		 }     
		@PermitAll    
		 public Object getExampleRessource() {        
		 //...    
		 }
		}
	

Effiziente Verwaltung von Roles durch Groups

Häufig ist es möglich, Gruppen von Usern mit mehreren Zugriffsberechtigungen zu definieren, beispielsweise entsprechend dem Aufbau eines Unternehmens. Diese könnt ihr in Keycloak als Groups anlegen und diesen Roles zuordnen. Anschließend könnt ihr Benutzerinnen und Benutzer einer beliebigen Anzahl an Groups zuweisen. Der Vorteil daran ist, dass ihr eure Roles nicht einzeln den Usern zuweisen müsst und euch so eine Wartungshölle erspart (dennoch ist es auch möglich, Roles den Usern einzeln zuzuweisen). Abbildung 3 zeigt exemplarisch die Role-Übersicht über eine Group „Manager“.

Benutzerinnen und Benutzer einer Group haben automatisch alle zugeordneten Roles und so Zugriff auf die entsprechenden Ressourcen. Groups sind hierarchisch, sodass Berechtigungen beliebig feingranular verwaltet werden können.

In unserem Beispiel möchte ich nun User aus verschiedenen Unternehmen definieren. Dazu erstelle ich für die jeweiligen Unternehmen jeweils eine Group. Innerhalb der Unternehmen gibt es Mitarbeitende in verschiedenen Bereichen. In dem Unternehmen „Unternehmen_1“ werden Manager und Entwickelnde und im Unternehmen „Unternehmen_2“ darüber hinaus noch Sales-Mitarbeitende beschäftigt. Außerdem soll es für Entwicklerinnen und Entwickler aus der Region Nordamerika noch zusätzliche Zugriffsberechtigungen geben. Daraus ergibt sich die in Abbildung 4 dargestellte Hierarchie von Groups. Diesen Groups können beliebig Roles zugewiesen werden, um eine feingranulare Zugriffsberechtigung zu ermöglichen.

Fazit

Keycloak ist ein einfach zu integrierendes Standard-IAM-System. Mit meinem Blog-Artikel habe ich euch eine kurze Einführung in die Administration von Zugriffsberechtigungen gegeben, sodass ihr in der Lage seid, diese in eigenen Kontexten anzuwenden. Grundlage hierfür sind verschiedene Typen von Roles, die den Usern durch Groups effizient zugeordnet werden können. Groups sind hierarchisch, sodass zu einer Group zugeordnete Roles auch in den darunterliegenden Groups verfügbar sind. Dadurch kann ein feingranulares Zugriffsberechtigungskonzept für die Autorisierung erstellt werden. Dies habe ich euch anhand einiger kurzer Beispiele erläutert. Natürlich gibt es zu Keycloak noch viele weitere spannende Themen, die jedoch einen eigenen Blogartikel verdienen.

Hier findet ihr weitere Infos rund um das Thema Keycloak:

Bild Daniel Lenzen

Autor Daniel Lenzen

Daniel Lenzen hat Informatik studiert und arbeitet seit 2017 für adesso. Aktuell ist er in einem Projekt zur Entwicklung einer Plattform für digitale Bürgschaften tätig.

Diese Seite speichern. Diese Seite entfernen.