Este módulo permite a Anjana Data conectarse a un realm de Keycloak para descargar y sincronizar usuarios mediante la Admin REST API.
La sincronización obtiene todos los usuarios activos del realm configurado, incluyendo sus atributos estándar (username, email, firstName, lastName) y cualquier atributo personalizado (User Profile).
Parte 1: Configuración en Keycloak Admin Console
Para que Anjana pueda leer los usuarios, es necesario crear un cliente confidencial con una cuenta de servicio y asignarle los permisos de lectura adecuados.
Paso 1: Crear el cliente de aprovisionamiento
-
Acceda a la Admin Console de Keycloak y seleccione el realm del que desea sincronizar los usuarios.
-
Vaya a Clients > Create client.
-
Configure los campos básicos:
-
Client type:
OpenID Connect -
Client ID: Defina un nombre descriptivo, ej.
anjana-provisioning
-
-
En la pantalla de Capability config:
-
Client authentication:
ON(modo confidencial, necesario para obtener el secreto) -
Service accounts roles:
ON(habilita la cuenta de servicio para este cliente) -
Authorization:
OFF
-
-
Haga clic en Save.
-
En la pestaña Credentials, copie el Client Secret.
Paso 2: Asignar el rol view-users
La cuenta de servicio del cliente necesita el rol view-users del cliente interno realm-management.
-
Con el cliente recién creado abierto, vaya a la pestaña Service accounts roles.
-
Haga clic en Assign role.
-
En el desplegable de filtro, seleccione Filter by clients.
-
Busque
realm-managementy seleccione el rolview-users. -
Haga clic en Assign.
¿Por qué realm-management? Keycloak gestiona los permisos administrativos a través del cliente interno realm-management. El rol view-users otorga acceso de solo lectura al listado de usuarios del realm sin conceder permisos de escritura ni administración.
Paso 3: Verificar el acceso
Puede verificar que las credenciales son correctas con la siguiente llamada:
# 1. Obtener token de acceso
TOKEN=$(curl -s -X POST \
"https://<keycloak-server>/realms/<realm>/protocol/openid-connect/token" \
-d "grant_type=client_credentials" \
-d "client_id=anjana-provisioning" \
-d "client_secret=<client-secret>" | jq -r '.access_token')
# 2. Listar usuarios (debe devolver un array JSON)
curl -s -H "Authorization: Bearer $TOKEN" \
"https://<keycloak-server>/admin/realms/<realm>/users?max=5"
Parte 2: Configuración en application.yml
Edite el archivo de configuración de Anjana e incluya los datos obtenidos en la sección security.provisioning.providers.keycloak.
security:
provisioning:
providers:
keycloak:
# Clave única para identificar este proveedor (puede ser cualquier nombre, ej: keycloak-corp)
keycloak-corp:
# URL base del servidor Keycloak (sin el realm)
server-url: "https://sso.mi-dominio.com"
# Nombre del realm del que se sincronizarán los usuarios
realm: "mi-realm"
# Client ID del cliente creado en el Paso 1
client-id: "anjana-provisioning"
# Client Secret obtenido en el Paso 1
client-secret: "${KEYCLOAK_PROVISIONING_SECRET}"
Múltiples realms: Si necesita sincronizar usuarios de varios realms, añada una entrada por cada uno con una clave diferente:
keycloak:
keycloak-corp:
server-url: "https://sso.mi-dominio.com"
realm: "corp"
client-id: "anjana-provisioning"
client-secret: "..."
keycloak-partners:
server-url: "https://sso.mi-dominio.com"
realm: "partners"
client-id: "anjana-provisioning"
client-secret: "..."
Atributos sincronizados
Los siguientes campos se obtienen del endpoint GET /admin/realms/{realm}/users. Todos los atributos estándar y personalizados están disponibles para field-mapping.
|
Campo Anjana |
Campo Keycloak (por defecto) |
Notas |
|---|---|---|
|
|
|
Si está vacío, se usa el |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Atributo personalizado del usuario (de |
|
|
|
Atributo personalizado del usuario (de |
Atributos personalizados: Para que phoneNumber y title se sincronicen, deben existir como atributos de usuario en Keycloak. Puede añadirlos en Realm Settings > User profile o directamente en el perfil de cada usuario.
Mapeo de campos personalizado (field-mapping)
Anjana incluye un mapeo por defecto que cubre los casos habituales. Puede sobreescribir cualquier campo indicando la clave del atributo Keycloak de la que debe leer el valor. Las claves son listas en orden de prioridad: se usa el primer valor no vacío.
Anjana aplana automáticamente el mapa de atributos de Keycloak (attributes), por lo que los atributos personalizados son accesibles como claves de primer nivel. Por ejemplo, si tiene attributes.department, puede referenciarlo simplemente como department.
Mapeo por defecto
|
Campo Anjana |
Claves por defecto (orden de prioridad) |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Campos disponibles
Anjana expone tanto los campos raíz del usuario como todos los atributos personalizados aplanados como claves de primer nivel.
|
Clave |
Descripción |
|---|---|
|
|
UUID único del usuario en Keycloak. |
|
|
Nombre de usuario de login. |
|
|
Dirección de correo electrónico. |
|
|
Nombre de pila. |
|
|
Apellidos. |
|
|
|
|
|
|
|
<nombre del atributo> |
Cualquier atributo personalizado definido en el User Profile del realm (ej. |
Ejemplo de configuración
security:
provisioning:
providers:
keycloak:
keycloak-corp:
server-url: "https://sso.mi-dominio.com"
realm: "mi-realm"
client-id: "anjana-provisioning"
client-secret: "..."
field-mapping:
# Usar email como userName si username está vacío
user-name: ["username", "email"]
# Leer teléfono del atributo 'mobile' o 'phoneNumber'
phone: ["mobile", "phoneNumber"]
# Cargo del atributo 'position' o 'title'
title: ["position", "title"]
Resumen de datos requeridos
|
Propiedad YAML |
Descripción |
Dónde encontrarlo |
|---|---|---|
|
|
URL base de Keycloak (sin el realm) |
URL de acceso a la Admin Console |
|
|
Nombre del realm |
Selector de realm en la Admin Console |
|
|
Client ID del cliente de aprovisionamiento |
Clients > <cliente> > Settings |
|
|
Secreto del cliente |
Clients > <cliente> > Credentials |