Como sincronizar usuário com o LDAP

Problema

Quando um usuário individual (ainda não registrado no CRX) tenta efetuar logon, o CRX autentica mediante o LDAP e, se a autenticação for bem-sucedida, esse usuário será sincronizado com o CRX. Então como forçar a sincronização de usuários LDAP com o CRX para que os direitos possam ser atribuídos antes que o usuário tente fazer o logon pela primeira vez?

Solução

A partir da atualização do service pack do CQ 5.5 [1] em diante, o CRX que fornece a funcionalidade ldap é um serviço OSGi. O LDAP está registrado no Registro de Serviço OSGi como serviço MBean. Este MBean está disponível no Console JMX, que expõe os atributos e operações do ldap. A operação que pode ser executada está listada em [0]. Algumas das formas de conseguir a sincronização do usuário são

  • Sincronização manual de usuários usando o console felix
  • Usando CURL
  • Criação do cliente JMX que usa o MBean LDAP

Sincronização manual de usuários usando o console felix

  • Abra o console felix jmx e faça o logon como administrador em http://<host>:<port>/system/console/jmx
  • Clique no domínio com.adobe.granite.ldap e exiba a lista de atributos e operações que podem ser executadas. 
  • Ao clicar nas operações, surge uma pequena janela para fornecer o parâmetro (se necessário). Ex:- operação syncUser, forneça o DN do usuário único (cn=user001 ou=usuários, dc=dia, dc=com) para ser sincronizado
  • Clique em Invocar para transferir os detalhes apropriados do servidor de diretório ldap para o CRX.

Usando CURL

  • Listar usuários órfãos
    curl -u <UID>:<PASSWORD> -X POST http://<HOST>:<PORT>/system/console/jmx/com.adobe.granite.ldap:host=<ldaphost>,port=<ldapport>,type=Tools/op/listOrphanedUsers/
  • Sincronizar todos os usuários
    curl -u <UID>:<PASSWORD> -X POST http://<HOST>:<PORT>/system/console/jmx/com.adobe.granite.ldap:host=<ldaphost>,port=<ldapport>,type=Tools/op/syncAllUsers/
  • Sincronizar usuário
    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
  • Sincronizar lista de usuários
    Ex:- Para sincronizar 2 usuários user007 e user008 em meu 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
  • Eliminar usuários
    curl -u <UID>:<PASSWORD> -X POST http://<HOST>:<PORT>/system/console/jmx/com.adobe.granite.ldap:host=<ldaphost>,port=<ldapport>,type=Tools/op/purgeUsers/
  • Sincronizar usuários
    curl -u <UID>:<PASSWORD> -X POST http://<HOST>:<PORT>/system/console/jmx/com.adobe.granite.ldap:host=<ldaphost>,port=<ldapport>,type=Tools/op/syncUsers/

Crie o cliente JMX que usa o MBean LDAP

Abaixo está o código do cliente jmx de amostra que imprime a lista de usuários órfãos

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]

  • Listar usuários órfãos:- Recupera uma lista de usuários que não estão mais presentes no diretório LDAP.
  • Sincronizar todos os usuários:- Atualiza todas as informações do usuário local com base no diretório LDAP.
  • Sincronizar usuário:- Atualiza as informações do usuário local para uma entrada LDAP específica.
  • Sincronizar lista de usuários:- Atualiza as informações do usuário local para uma lista de entradas LDAP.
  • Eliminar usuários:- Remove as informações do usuário local para todos os usuários removidos do servidor LDAP.
  • Sincronizar usuários:- Atualiza as informações do usuário local para a lista definida no atributo orphaned.users.

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


Observação:- Se você retirou a configuração do LDAP ou o LDAP não está configurado, o Mbean não estará visível no console JMX.

Aplica-se a

CRX 2.3

Logotipo da Adobe

Fazer logon em sua conta