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
Fazer logon em sua conta