web-dev-qa-db-fra.com

Récupérer le nom d'utilisateur connecté dans une webapp sécurisée avec Keycloak

J'ai sécurisé une application d'entreprise avec Keycloak en utilisant des adaptateurs Keycloak standard basés sur Wildfly. Le problème auquel je suis confronté est que les autres services Web, lorsqu'ils sont appelés, doivent connaître le nom d'utilisateur actuellement connecté. Comment puis-je obtenir les informations utilisateur connecté de Keycloak?

J'ai essayé d'utiliser SecurityContext, WebListener etc. Mais aucun d'eux ne peut me donner les détails requis.

18
aksappy

Vous obtenez toutes les informations utilisateur du contexte de sécurité.

Exemple:

public class Greeter {

  @Context
  SecurityContext sc;

  @GET
  @Produces(MediaType.APPLICATION_JSON)
  public String sayHello() {

    // this will set the user id as userName
    String userName = sc.getUserPrincipal().getName();

    if (sc.getUserPrincipal() instanceof KeycloakPrincipal) {
      KeycloakPrincipal<KeycloakSecurityContext> kp = (KeycloakPrincipal<KeycloakSecurityContext>)  sc.getUserPrincipal();

      // this is how to get the real userName (or rather the login name)
      userName = kp.getKeycloakSecurityContext().getIdToken().getPreferredUsername();
    }

    return "{ message : \"Hello " + userName + "\" }";
}

Pour que le contexte de sécurité soit propagé, vous devez avoir un domaine de sécurité configuré comme décrit dans: configuration de l'adaptateur JBoss/Wildfly

28
sebplorenz

Vous pouvez également définir le principal-attribute propriété dans le keycloak.json fichier de votre application Web vers preferred_username.

18
user3569718

Besoin d'ajouter standalone.xml ligne suivante:

<principal-attribute>preferred_username</principal-attribute>

Exemple:

<subsystem xmlns="urn:jboss:domain:keycloak:1.1">
    <secure-deployment name="war-name.war">
        <realm>realm-name</realm>
        <resource>resource-name</resource>
        <public-client>true</public-client>
        <auth-server-url>https://keycloak-hostname/auth</auth-server-url>
        <ssl-required>EXTERNAL</ssl-required>
        <principal-attribute>preferred_username</principal-attribute>
    </secure-deployment>
</subsystem>
1
Sergey Sarabun

Dans Keycloak 3.4.3 (peut également fonctionner sur les versions antérieures), j'ai pu mapper le nom d'utilisateur au nom de revendication de jeton sub. Depuis l'interface d'administration de Keycloak, cela se fait sous Clients > [your-client] > Mappers > username puis entrez sub dans le Token Claim Name champ. Cela a l'avantage de modifier le contenu du ID token retourné par Keycloak plutôt que d'ajuster côté client comme dans autre réponse . C'est particulièrement agréable lorsque vous utilisez une bibliothèque OpenID Connect standard plutôt qu'un adaptateur fourni par Keycloak.

1
Yeroc

Dans mon cas, je prenais le nom d'utilisateur préféré du jeton comme celui-ci

keycloakPrincipal.getKeycloakSecurityContext().getToken();
token.getPreferredUsername();

Pour travailler, je devais aller à keycloak et ajouter sur mon modèle client les ajouts intégrés sinon ajoutés le nom d'utilisateur préféré est devenu nul.

Vérifiez le nom d'utilisateur sur les ins intégré, modèle client -> mappeurs.

Après ça si ça marche!

0
cabaji99