Bonjour à tous (et toutes )
Je bosse en ce moment sur les annuaires LDAP et j'ai besoin de synchroniser une base Mysql avec un annuaire LDAP.
La base mysql contient les utilisateurs et le but est d'utiliser LDAP pour pouvoir authentifier les utilisateurs (avec PAM).
J'ai rédigé un script PHP qui compare chaque attribut de chaque entrée et qui corrige les valeurs si besoin.
J'explique le fonctionnement :
Pour chaque entré mysql, j'ai le dn de l'utilisateur.
Les attributs à vérifier sont définis dans un tableau $attrs
Pour chaque attribut dans $attrs j'utilise la fonction ldap_compare
En fonction du résultat de ldap_compare :
- l'attribut est modifié s'il est différent
- l'attribut est crée s'il n'existe pas dans LDAP
- l'objet est crée s'il n'existe pas
Voici la boucle actuelle :
Le problème que je rencontre : j'ai autant de requête LDAP (ldap_compare) que d'attribut. Multiplié par environ 6000 (utilisateurs), le serveur LDAP ne se repose pas
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66 // [...] Connexion LDAP, requete sql, etc... while ($user_sql = mysql_fetch_array($sql_user) ) { // Pour chaque user trouvé, vérification des attributs $value = ""; $attrs = ""; // mise en forme du dn à partir de l'uid $dn = Uid2dn($user_sql['uid_cpt']); $password = encode_pass($user_sql['password_cpt']); // Les attributs à vérifier $attrs = array( 'uid' => $user_sql['login_cpt']; 'cn' => $user_sql['login_cpt']; 'uidNumber' => intval($user_sql['uid_cpt']); // Doit être un entier 'gidNumber' => intval($user_sql['uid_cpt']); // Doit être un entier 'homeDirectory' => $user_sql['dir_cpt']; 'loginShell' => "/bin/false"; 'userPassword' => $password; 'uid' => $user_sql['login_cpt']; ); //echo "Attributs d'après Mysql : "; //print_r($attrs); // comparaison sur le dn de chaque attribut définis plus haut foreach($attrs as $attr=>$valeur_sql) { $r=@ldap_compare($ldapconn, $dn, $attr, $valeur_sql); // Traitement des errreurs de comparaison. // les erreurs ldap : http://fr2.php.net/manual/fr/function.ldap-errno.php if ($r === -1) { // erreur ldap (dn invalid, invalid credentials, etc...) // LDAP_INVALID_DN_SYNTAX 0x22 // NO_SUCH_ATTRIBUTE 0x10 // LDAP_NO_SUCH_OBJECT 0x20 if(ldap_errno($ldapconn) == 0x22 ) { $logs .= "$dn invalide \n"; } if(ldap_errno($ldapconn) == 0x10 ) { // NO_SUCH_ATTRIBUTES $values["$attr"] = "$valeur_sql"; //print_r($values); if (ldap_modify($ldapconn, $dn, $values)) { echo "$dn \t $attr crée\n"; //$logs .= "$dn \t $attr crée\n"; $modifs++; } } //else print(ldap_err2str(ldap_errno($ldapconn))); } elseif ($r === FALSE) { // la requete est ok mais pas de correspondance-> modif l'attribut //$logs .= "$dn \t $attr: ne correspond pas à la valeur mysql ($valeur_sql) : \n"; $values["$attr"] = "$valeur_sql"; if (ldap_modify($ldapconn, $dn, $values)) { // modification de l'attribut //$logs .= "$dn \t $attr définit à $valeur_sql \n"; //echo "$dn \t $attr définit à $valeur_sql \n"; $modifs++; } } elseif ($r === TRUE) { // Les valeurs sont bonnes //echo "Pas de changements à faire : $dn. \n"; } }
J'aurais voulu savoir s'il était possible de comparer l'ensemble des attributs d'un objet LDAP par rapport aux données mysql.
Genre faire un tableau avec les données mysql mises en forme pour LDAP, un tableau avec les attributs et valeurs LDAP et comparer les deux.
Appel aux spécialistes
Merci
Partager