Problème

Lorsqu’un utilisateur individuel (pas encore enregistré dans CRX) tente de se connecter, CRX authentifie auprès du LDAP et, si l’authentification réussit, l’utilisateur est synchronisé avec CRX. Alors, comment forcer la synchronisation des utilisateurs LDAP avec CRX afin que les droits puissent être affectés avant que l'utilisateur essaie de se connecter ?

Résolution

Depuis la mise à jour du service pack CQ 5,5, [1] le CRX qui fournit la fonctionnalité ldap est un service OSGi. Le LDAP est enregistré dans le registre de services OSGi en tant que service MBean. Ce fichier MBean est disponible dans la console JMX qui expose les attributs et opérations ldap. Les opérations qui peuvent être effectuées sont répertoriées sur [0]. La synchronisation de l’utilisateur est faisable grâce aux méthodes suivantes :

  • Synchronisation manuelle des utilisateurs à l’aide de la console Felix.
  • Utilisation de CURL
    .
  • Création d’un client JMX utilisant LDAP MBean.

Synchronisation manuelle des utilisateurs à l'aide de la console Felix.

  • Ouvrez la console Felix JMX et connectez-vous en tant qu'administrateur à http://<host>:<port>/system/console/jmx.
  • Cliquez sur le domaine com.adobe.granite.ldap et cela affiche la liste des attributs et des opérations pouvant être effectuées.
  • Cliquez sur les opérations et faites apparaître la petite fenêtre pour fournir le paramètre (si nécessaire). Ex. : opération syncUser, fournissez le NOM UNIQUE de l'utilisateur à synchroniser (cn = user001, ou = users, dc = days, dc = com).
  • Cliquez sur Invoquer pour transférer les détails appropriés du répertoire ldap vers CRX.

Utilisation de CURL.

  • La liste des utilisateurs orphelins
    curl -u <UID>:<PASSWORD> -X POST http://<HOST>:<PORT>/system/console/jmx/com.adobe.granite.ldap:host=<ldaphost>,port=<ldapport>,type=Tools/op/listOrphanedUsers/
  • La synchronisation de tous les utilisateurs
    curl -u <UID>:<PASSWORD> -X POST http://<HOST>:<PORT>/system/console/jmx/com.adobe.granite.ldap:host=<ldaphost>,port=<ldapport>,type=Tools/op/syncAllUsers/
  • L’utilisateur de synchronisation
    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.
  • Liste des utilisateurs de synchronisation
    Ex : Pour synchroniser 2 utilisateurs (user007 & user008) sur mon localhos
    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
  • La purge des utilisateurs
    curl -u <UID>:<PASSWORD> -X POST http://<HOST>:<PORT>/system/console/jmx/com.adobe.granite.ldap:host=<ldaphost>,port=<ldapport>,type=Tools/op/purgeUsers/.
  • Les utilisateurs de synchronisation
    curl -u <UID>:<PASSWORD> -X POST http://<HOST>:<PORT>/system/console/jmx/com.adobe.granite.ldap:host=<ldaphost>,port=<ldapport>,type=Tools/op/syncUsers/

Créez le client JMX qui utilise le MBean LDAP.

Vous trouvez ci-dessous un exemple de code client jmx qui imprime la liste d'utilisateurs Orphaned.

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]

  • Liste des utilisateurs orphelins : extrait une liste d'utilisateurs qui ne sont plus présents dans le répertoire LDAP.
  • Synchronisation de tous les utilisateurs : met à jour tous les utilisateurs locaux en fonction du répertoire LDAP.
  • Synchronisation de l’utilisateur : met à jour les informations de l’utilisateur local pour une entrée LDAP spécifique.
  • Synchroniser la liste des utilisateurs : met à jour les informations de l'utilisateur local pour une liste d’entrées LDAP.
  • Purge des utilisateurs : supprime les informations de l'utilisateur locale pour tous les utilisateurs supprimés du serveur LDAP.
  • Synchronisation des utilisateurs : met à jour les informations de l’utilisateur local pour la liste définie dans l’attribut des utilisateurs orphelins.

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


Remarque : - Si vous avez quitté la configuration LDAP ou si LDAP n'est pas configuré, Mbean n'est pas visible dans la console JMX.

S’applique à

CRX 2.3

Ce produit est distribué sous licence Creative Commons Attribution - Pas d’utilisation commerciale - Partage à l’identique 3.0 non transposé  Les publications Twitter™ et Facebook ne sont pas couvertes par les dispositions Creative Commons.

Mentions légales   |   Politique de confidentialité en ligne