Problema

Cuando un usuario individual (aún no registrado en CRX) intenta iniciar sesión, CRX se autentica contra LDAP y si la autenticación tiene éxito, entonces ese usuario se sincroniza con CRX. Entonces, ¿cómo forzar la sincronización de los usuarios LDAP con CRX para que los derechos puedan ser asignados antes de que el usuario intente iniciar sesión por primera vez?

Resolución

A partir de la actualización del service pack CQ 5.5 [1], el CRX que proporciona la funcionalidad ldap es un servicio de OSGi. El LDAP está registrado en el Registro de servicios de OSGi como servicio MBean. MBean está disponible en la consola JMX que expone los atributos y operaciones de LDAP. La operación que se puede realizar está listada en [0]. Algunas de las formas de lograr la sincronización del usuario son las siguientes:

  • Sincronización manual de usuarios usando la consola felix.
  • Uso de CURL.
  • Creación del cliente JMX que utiliza LDAP MBean

Sincronización manual de usuarios usando la consola Felix

  • Abra la consola Felix jmx e inicie sesión como administrador en http://<host>:<port>/system/console/jmx
  • Cuando hace clic en el dominio com.adobe.granite.ldap se muestra la lista de atributos y operaciones que se pueden realizar.
  • Haga clic en las operaciones y aparecerá una pequeña ventana para suministrar el parámetro (si es necesario). Ejemplo: la operación syncUser suministra el DN del usuario individual (cn=user001,ou=users,dc=day,dc=com) a sincronizar
  • Haga clic en Invocar para transferir los detalles apropiados del servidor de directorio LDAP a CRX.

Uso de CURL

  • Lista de usuarios huérfanos
    curl -u <UID>:<PASSWORD> -X POST http://<HOST>:<PORT>/system/console/jmx/com.adobe.granite.ldap:host=<ldaphost>,port=<ldapport>,type=Tools/op/listOrphanedUsers/
  • Sincronización de todos los usuarios
    curl -u <UID>:<PASSWORD> -X POST http://<HOST>:<PORT>/system/console/jmx/com.adobe.granite.ldap:host=<ldaphost>,port=<ldapport>,type=Tools/op/syncAllUsers/
  • Sincronización de usuarios
    curl -u <UID>:<PASSWORD> -X POST --data user=<cn=user001,ou=users,dc=day,dc=com> http://<HOST>:<PORT>/system/console/jmx/com.adobe.granite.ldap:host=<ldaphost>,port=<ldapport>,type=Tools/op/syncUser/java.lang.String
  • Sincronización de la lista de usuario
    Ex:-  To sync 2 users user007 & user008 on my localhost
    curl -u <UID>:<PASSWORD> -X POST --data userlist=%5B%22cn%3Duser007%2Cou%3Dusers%2Cdc%3Dday%2Cdc%3Dcom%22%2C%22cn%3Duser008%2Cou%3Dusers%2Cdc%3Dday%2Cdc%3Dcom%22%5D http://localhost:4502/system/console/jmx/com.adobe.granite.ldap%3Ahost%3Dlocalhost%2Cport%3D389%2Ctype%3DTools/op/syncUserList/%5BLjava.lang.String%3B
  • Purga de usuarios
    curl -u <UID>:<PASSWORD> -X POST http://<HOST>:<PORT>/system/console/jmx/com.adobe.granite.ldap:host=<ldaphost>,port=<ldapport>,type=Tools/op/purgeUsers/
  • Sincronización de usuarios
    curl -u <UID>:<PASSWORD> -X POST http://<HOST>:<PORT>/system/console/jmx/com.adobe.granite.ldap:host=<ldaphost>,port=<ldapport>,type=Tools/op/syncUsers/

Creación de un cliente JMX que utilice LDAP MBean

A continuación, se muestra un ejemplo de código de cliente jmx que imprime la lista de usuarios huérfanos

import javax.management.DynamicMBean;
import java.util.Hashtable;

import javax.management.MBeanServerConnection;
import javax.management.MBeanServerInvocationHandler;
import javax.management.ObjectName;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;

public class LDAPSampleClient {

    public static void main(String[] args) throws Exception{
        String userid = "admin";
        String password = "admin";
        String serverUrl = "service:jmx:rmi:///jndi/rmi://localhost:9000/jmxrmi";
        String OBJECT_NAME = "com.adobe.granite.ldap:host=localhost,port=389,type=Tools";
        String[] buffer = new String[] { userid, password };
        Hashtable<String, String[]> attributes = new Hashtable<String, String[]>();
        attributes.put("jmx.remote.credentials", (String[]) buffer);        
        MBeanServerConnection server = (MBeanServerConnection) JMXConnectorFactory.connect(new JMXServiceURL(serverUrl), attributes).getMBeanServerConnection();
        ObjectName name = new ObjectName(OBJECT_NAME);
        LDAPUserMBean ldap = (LDAPUserMBean) MBeanServerInvocationHandler.newProxyInstance(server, name, LDAPUserMBean.class,false);
        for(String user : ldap.listOrphanedUsers()) {
            System.out.println(user);
        }
    }

    public static interface LDAPUserMBean extends DynamicMBean {
        public String[] listOrphanedUsers();
        public String[] syncUsers(String[] users);
        public void syncAllUsers();
        public void syncUser(String user);
        public void syncOrphanedUsers();
        public void purgeOrphanedUsers();
    }
    
}

[0]

  • Lista de usuarios huérfanos:- recupera una lista de usuarios que ya no están presentes en el directorio LDAP.
  • Sincronizar todos los usuarios:- actualiza toda la información de los usuarios locales basada en el directorio LDAP.
  • Sincronizar usuario:- actualiza la información del usuario local para una entrada LDAP específica.
  • Sincronización de la lista de usuarios:- actualiza la información del usuario local para una lista de entradas LDAP.
  • Purga de usuarios:- elimina la información de usuario local de todos los usuarios eliminados del servidor LDAP.
  • Sincronización de usuarios:- actualiza la información del usuario local para la lista definida en el atributo orphaned.users.

[1]   http://dev.day.com/packageshare/packages/public/day/cq550/update/cq-update-pkg.html


Nota:- Si has contratado LDAP config O LDAP no está configurado, entonces Mbean no será visible en la consola JMX.

Se aplica a

CRX 2.3