IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Synchronisation Mysql - LDAP [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 9
    Points : 7
    Points
    7
    Par défaut Synchronisation Mysql - LDAP
    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 :

    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";
                    }
     
                }
    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

    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

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Je me suis désembrouillé le cerveau et mis au clair comment je dois procéder :

    LDAP est mis à jour selon les données mysql.
    Les tableaux contenant les donneés :
    - un tableau mysql contenant les bonnes infos
    - un tableau ldap contenant des infos qui ne sont plus dans mysql
    Il faut sélectionner dans le tableau ldap ce qui n'existe pas dans le tableau mysql (pour les supprimer)

    Quelles fonctions utiliser ? (Exemples ?)

    Après je me débrouille

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Re (à moi même...)

    J'ai réussi à faire ce que je voulais avec la fonction array_diff :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    [...]
    // Un tableau $uid_mysql contient les infos de mysql
    // Un tableau $uid_mysql contient les infos ldap
     
    // Pour avoir les valeurs présentes dans Mysql et pas dans LDAP :
            $ajout = array_diff($uid_mysql, $uid_ldap);
     
    // Pour avoir les valeurs présentes dans LDAP et pas dans Mysql :
            $supp = array_diff($uid_ldap, $uid_mysql);
    Reste à bosser surles valeurs des tableaux $ajout et $supp qui contiennent ce qu'il faut ajouter / supprimer

    En espérant que ça serve à d'autres

    A++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Import / Export Mysql<->LDAP
    Par Malone dans le forum Outils
    Réponses: 2
    Dernier message: 19/02/2009, 10h18
  2. Synchronisation MySql ACCESS
    Par fmh1982 dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 26/01/2007, 13h41
  3. Relation MySQL LDAP
    Par johandev dans le forum Requêtes
    Réponses: 6
    Dernier message: 25/01/2007, 14h49
  4. Synchronisation Avec LDAP
    Par Patrick31 dans le forum Access
    Réponses: 1
    Dernier message: 24/10/2006, 18h04
  5. synchronisation mysql SQL server
    Par constantin dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 05/01/2006, 18h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo