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

Questo prodotto è concesso in licenza in base alla licenza di Attribuzione-Non commerciale-Condividi allo stesso modo 3.0 Unported di Creative Commons.  I post su Twitter™ e Facebook non sono coperti dai termini di Creative Commons.

Note legali   |   Informativa sulla privacy online