web-dev-qa-db-fra.com

Keycloak récupérer des attributs personnalisés à KeycloakPrincipal

Dans mon service de repos, je peux obtenir les informations principales après l'authentification en utilisant

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

déclaration.

Le principal de Keycloak ne contient pas toutes les informations dont j'ai besoin sur l'utilisateur authentifié. Est-il possible de personnaliser mon propre type principal? Du côté serveur-clé, j'ai développé un fournisseur de fédération d'utilisateurs. J'ai vu que UserModel permet d'ajouter un ensemble d'attributs personnalisés à mon utilisateur.

Est-il possible d'insérer mon principal personnalisé dans ce code?

Est-il possible de récupérer ces attributs du principal de keycloak?

Quelle est la voie?

30
Alex

Pour ajouter des attributs personnalisés, vous devez faire trois choses:

  1. Ajouter des attributs à la console d'administration
  2. Ajouter un mappage de revendications
  3. Revendications d'accès

Le premier est expliqué assez bien ici: https://www.keycloak.org/docs/latest/server_admin/index.html#user-attributes

Ajouter un mappage de revendications:

  1. Ouvrez la console d'administration de votre domaine.
  2. Allez dans Clients et ouvrez votre client
  3. Cela ne fonctionne que pour Paramètres> Type d'accès confidentiel ou public (pas uniquement au porteur)
  4. Accéder aux mappeurs
  5. Créez un mappage de votre attribut vers json
  6. Cochez "Ajouter au jeton ID"

Revendications d'accès:

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(...);
}

J'espère que cela aide et correspond à votre cas d'utilisation. Je l'ai utilisé pour un attribut personnalisé que j'ai ajouté avec un thème personnalisé.

61
lisa p.
  • Sélectionnez Utilisateurs> Recherche> cliquez sur ID> allez dans l'onglet attributs> Ajouter un attribut> par exemple: téléphone> Enregistrer enter image description here

  • Sélectionnez Clients> cliquez sur ID client> allez dans l'onglet Mappeurs> créez un mappeur

    enter image description here

    enter image description here

    enter image description here

  • Obtenez des attributs personnalisés

    enter image description here

    enter image description here

MISE À JOUR

  • Ajoutez l'attribut "téléphone" au niveau du groupe, affectez l'utilisateur à ce groupe et vous obtenez l'attribut "téléphone" du niveau du groupe pour tous les utilisateurs

  • Revenez au mappeur et mettez à jour 'phone' avec 'Aggregate attribute values ​​= true' et 'Multivalued = true', et vous obtenez 'phone' en tant que liste avec les deux attributs au niveau du groupe et de l'utilisateur. Si vous conservez 'Aggregate attribute values ​​= false' ou 'Multivalued = false', vous obtenez une seule valeur, où l'attribut 'phone' de l'utilisateur remplacera l'attribut 'phone' du groupe (ce qui a du sens)

29
Neeraj Benjwal