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.
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
Vous pouvez également définir le principal-attribute
propriété dans le keycloak.json
fichier de votre application Web vers preferred_username
.
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>
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.
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!