java - español - keycloak windows
Obtener nombre de usuario registrado en una aplicación web asegurada con Keycloak (5)
En Keycloak 3.4.3 (también puede funcionar en versiones anteriores) pude asignar un nombre de usuario al nombre de reclamo del token sub
. Desde la interfaz de administración de Keycloak, esto se hace en Clients > [your-client] > Mappers > username
y luego ingrese sub
en el campo Token Claim Name
. Esto tiene la ventaja de cambiar realmente el contenido del ID token
devuelto por Keycloak en lugar de ajustar el lado del cliente como en la otra respuesta . Esto es particularmente bueno cuando utiliza una biblioteca estándar de OpenID Connect en lugar de un adaptador provisto por Keycloak.
He asegurado una aplicación empresarial con Keycloak utilizando adaptadores Keycloak estándar basados en wildfly. El problema al que me enfrento es que, cuando se invoca el resto de servicios web, es necesario saber el nombre de usuario que está conectado actualmente. ¿Cómo obtengo la información de usuario que ha iniciado sesión desde Keycloak?
Intenté usar SecurityContext
, WebListener
, etc. Pero ninguno de ellos es capaz de darme los detalles requeridos.
En mi caso, estaba tomando el nombre de usuario preferido del token como este
keycloakPrincipal.getKeycloakSecurityContext().getToken();
token.getPreferredUsername();
Para trabajar tuve que ir a keycloak y agregar en mi plantilla de cliente los agregados incorporados si no se agregaron los nombres de usuario preferidos.
Compruebe el nombre de usuario en las entradas integradas, plantilla de cliente -> asignadores.
Después de eso si funcionó!
Necesidad de agregar standalone.xml siguiente línea:
<principal-attribute>preferred_username</principal-attribute>
Ejemplo:
<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>
Obtienes toda la información del usuario del contexto de seguridad.
Ejemplo:
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 + "/" }";
}
Para que el contexto de seguridad se propague, debe tener un dominio de seguridad configurado como se describe en: Configuración del adaptador JBoss / Wildfly
También puede establecer la propiedad de principal-attribute
en el archivo keycloak.json
de su aplicación web en preferred_username
.