webentwicklung-frage-antwort-db.com.de

Keycloak ruft benutzerdefinierte Attribute für KeycloakPrincipal ab

In meinem Ruhe-Service kann ich die wichtigsten Informationen nach der Authentifizierung mit erhalten

KeycloakPrincipal kcPrincipal = (KeycloakPrincipal) servletRequest.getUserPrincipal();

aussage.

Keycloak Principal enthält nicht alle Informationen, die ich über den authentifizierten Benutzer benötige. Ist es möglich, meinen Haupttyp anzupassen? Auf der Keycloak-Server-Seite habe ich einen User Federation Provider entwickelt. Ich habe gesehen, dass UserModel es ermöglicht, meinem Benutzer eine Reihe von benutzerdefinierten Attributen hinzuzufügen.

Ist es möglich, mein benutzerdefiniertes Prinzipal in diesen Code einzufügen?

Ist es möglich, diese Attribute vom keycloak-Prinzipal abzurufen?

Wie ist der weg

30
Alex

Um benutzerdefinierte Attribute hinzuzufügen, müssen Sie drei Dinge tun:

  1. Attribute zur Admin-Konsole hinzufügen
  2. Claim-Mapping hinzufügen
  3. Zugriffsansprüche

Der erste wird hier ziemlich gut erklärt: https://www.keycloak.org/docs/latest/server_admin/index.html#user-attributes

Anspruchszuordnung hinzufügen:

  1. Öffnen Sie die Administratorkonsole Ihres Realms.
  2. Gehen Sie zu Clients und öffnen Sie Ihren Client
  3. Dies funktioniert nur für Einstellungen> Zugriffstyp "Vertraulich" oder "Öffentlich" (nicht nur für Inhaber).
  4. Gehe zu Mappers
  5. Erstellen Sie eine Zuordnung von Ihrem Attribut zu json
  6. Aktivieren Sie "Zu ID-Token hinzufügen".

Zugriffsansprüche:

final Principal userPrincipal = httpRequest.getUserPrincipal();

if (userPrincipal instanceof KeycloakPrincipal) {

    KeycloakPrincipal<KeycloakSecurityContext> kp = (KeycloakPrincipal<KeycloakSecurityContext>) userPrincipal;
    IDToken token = kp.getKeycloakSecurityContext().getIdToken();

    Map<String, Object> otherClaims = token.getOtherClaims();

    if (otherClaims.containsKey("YOUR_CLAIM_KEY")) {
        yourClaim = String.valueOf(otherClaims.get("YOUR_CLAIM_KEY"));
    }
} else {
    throw new RuntimeException(...);
}

Ich hoffe, das hilft und passt zu Ihrem Anwendungsfall. Ich habe dies für ein benutzerdefiniertes Attribut verwendet, das ich mit einem benutzerdefinierten Thema hinzugefügt habe.

61
lisa p.
  • Wählen Sie Benutzer> Nachschlagen> klicken Sie auf ID> gehen Sie zur Registerkarte Attribute> Attribut hinzufügen> z. B .: Telefon> Speichern enter image description here

  • Wählen Sie Clients aus, klicken Sie auf Client ID, gehen Sie zur Registerkarte Mappers und erstellen Sie einen Mapper

    enter image description here

    enter image description here

    enter image description here

  • Benutzerdefinierte Attribute abrufen

    enter image description here

    enter image description here

AKTUALISIEREN

  • Fügen Sie das Attribut "Telefon" auf Gruppenebene hinzu, weisen Sie dieser Gruppe einen Benutzer zu, und Sie erhalten das Attribut "Telefon" auf Gruppenebene für alle Benutzer

  • Kehren Sie zu Mapper zurück und aktualisieren Sie 'phone' mit 'Aggregate attribute values ​​= true' und 'Multivalued = true'. Sie erhalten 'phone' als Liste mit den Attributen von Gruppen- und Benutzerebene. Wenn Sie 'Aggregate attribute values ​​= false' oder 'Multivalued = false' beibehalten, erhalten Sie nur einen Wert, bei dem das 'phone'-Attribut des Benutzers das' phone'-Attribut der Gruppe überschreibt (was sinnvoll ist).

29
Neeraj Benjwal