Problema
Quando un singolo utente (non ancora registrato in CRX) tenta di effettuare il login, CRX si autentica contro LDAP e se l'autenticazione ha successo, l'utente viene sincronizzato con CRX. Quindi, come forzare la sincronizzazione degli utenti LDAP con CRX in modo che i diritti possano essere assegnati prima che l'utente provi ad effettuare il login?
Risoluzione
Dall'aggiornamento del service pack CQ 5.5 [1] in poi il CRX che fornisce la funzionalità ldap è un servizio OSGi. L'LDAP è registrato nel registro di servizio OSGi come servizio MBean. Questa MBean è disponibile nella console JMX che espone gli attributi e le operazioni di ldap. Le operazioni che possono essere eseguite sono elencate in [0]. Alcuni dei modi per ottenere la sincronizzazione dell'utente sono
- Sincronizzazione manuale degli utenti che utilizzano la console felix
- Utilizzo di CURL
- Creazione di un client JMX che utilizza LDAP MBean
Sincronizzazione manuale degli utenti che utilizzano la console felix
- Apri la console felix jmx e accedi come amministratore all'indirizzo http://<host>:<port>/system/console/jmx
- Facendo clic sul dominio com.adobe.granite.ldap viene visualizzato l'elenco degli attributi e delle operazioni che possono essere eseguite.
- Fai clic su operazioni e si apre con una piccola finestra per fornire i parametri (se necessario). Es:- funzionamento syncUser, fornisci il DN del singolo utente (cn=user001,ou=users,dc=day,dc=com) da sincronizzare
- Fai clic su Invoke per trasferire i dettagli appropriati dal server della directory ldap al CRX.
Utilizzo di CURL
- Elenco Utenti isolati
curl -u <UID>:<PASSWORD> -X POST http://<HOST>:<PORT>/system/console/jmx/com.adobe.granite.ldap:host=<ldaphost>,port=<ldapport>,type=Tools/op/listOrphanedUsers/ - Sincronizza tutti gli utenti
curl -u <UID>:<PASSWORD> -X POST http://<HOST>:<PORT>/system/console/jmx/com.adobe.granite.ldap:host=<ldaphost>,port=<ldapport>,type=Tools/op/syncAllUsers/ - Sincronizza utente
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 - Sincronizza elenco utenti
Es:- Per sincronizzare 2 utenti user007 & user008 sul mio 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 - Elimina utenti
curl -u <UID>:<PASSWORD> -X POST http://<HOST>:<PORT>/system/console/jmx/com.adobe.granite.ldap:host=<ldaphost>,port=<ldapport>,type=Tools/op/purgeUsers/ - Sincronizza utenti
curl -u <UID>:<PASSWORD> -X POST http://<HOST>:<PORT>/system/console/jmx/com.adobe.granite.ldap:host=<ldaphost>,port=<ldapport>,type=Tools/op/syncUsers/
Creare un client JMX che utilizza LDAP MBean
Di seguito è riportato un esempio di codice client jmx che stampa l'elenco degli utenti isolati
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]
- Elenco utenti isolati :- Recupera un elenco di utenti non più presenti nella directory LDAP.
- Sincronizza tutti gli utenti :- Aggiorna tutte le informazioni degli utenti locali basate sulla directory LDAP.
- Sincronizza utente:- Aggiorna le informazioni sull'utente locale per una specifica voce LDAP.
- Sincronizza elenco utenti:- Aggiorna le informazioni utente locali per un elenco di voci LDAP.
- Elimina utenti:- Rimuove le informazioni utente locale per tutti gli utenti rimossi dal server LDAP.
- Sincronizza utenti:- Aggiorna le informazioni utente locale per l'elenco definito nell'attributo orphaned.users.
[1] http://dev.day.com/packageshare/packages/public/day/cq550/update/cq-update-pkg.html
Nota:- Se hai eliminato LDAP config OPPURE LDAP non è configurato, allora Mbean non sarà visibile nella console JMX.
Si applica a
CRX 2.3