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

Bibliothèques et frameworks PHP Discussion :

[LDAP] php et ldap : ldap_compare


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Membre habitué
    Inscrit en
    Mai 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 14
    Par défaut [LDAP] php et ldap : ldap_compare
    Bonjours,

    Je souhaiterais vous demander un petit coup de main car pour mon stage(que je fait actuellement) une erreur se produit dans mon script et je n'arrive pas à la resoudre voila:

    mon script a pour fonction d'identifier un utilisateur par rapport a son groupe et son mot de passe hors lorsque la fonction ldap_compare arrive une erreur apparait qui est la suivante :
    "Compare : Insufficient Access....."
    J'ai essayer de m'identifer (grace a Ldap_bind) en tenmp que "superutilisateur" mais l'erreur apparait toujours pourriez vous m'aider pour regler ce probleme

    Merci d'avance!!!
    Laurent MERLET

  2. #2
    Membre habitué
    Inscrit en
    Mai 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 14
    Par défaut
    Bon puisque apparement personne ne peut m'aider j'ai une autre question pour resoudre mon probleme estt -il possible d'obtenir l'attribut userPassword d'une personne car malgres tous mes essaie je narrive malheureusement pas a récupéré cet attribut.

  3. #3
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Ceci est probablement dû aux droits (ACL) qui ne vous permettent pas d'y avoir accès.

  4. #4
    Membre habitué
    Inscrit en
    Mai 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 14
    Par défaut
    Citation Envoyé par julp
    Ceci est probablement dû aux droits (ACL) qui ne vous permettent pas d'y avoir accès.
    Pourrais tu explique ce que c'est s'il te plait car je ne connai pas cela et es ce que il y aurai un moyen de modifier ces droit??

  5. #5
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Certainement, mais cela est spécifique à l'annuaire utilisé.

    Une ACL (Access Control List) définit qui (OpenLDAP permet : un utilisateur authentifié, anonyme, qui se connecte avec telle ip, qui a tel DN, etc) accède à quoi (quel(s) objet(s), quels attributs de l'objet, en lecture et/ou en écriture, ...). On trouve parfois également sa forme dynamique, accolée aux objets, appelée ACI (Access Control Information).

  6. #6
    Membre habitué
    Inscrit en
    Mai 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 14
    Par défaut
    ok je vois maintenant, mais ya t'il un moyen de modifier cela ????? et comment ???
    Si tu connais la réponse bien sur

  7. #7
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Citation Envoyé par DarkstarZ
    ok je vois maintenant, mais ya t'il un moyen de modifier cela ????? et comment ???
    Citation Envoyé par julp
    Certainement, mais cela est spécifique à l'annuaire utilisé.
    Sans connaître l'annuaire que vous utilisez (OpenLDAP, Active Directory, etc), personne ne pourra vous répondre. Personnellement, je ne pourrais tenter de vous apporter mon aide que pour OpenLDAP (vous trouverez ces ACL dans votre fichier slapd.conf, directives de type access).

  8. #8
    Membre habitué
    Inscrit en
    Mai 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 14
    Par défaut
    Désoler je ne vous avais pas prévenus de l'aplication que j'utilise et c'est bien open LDAP et pour le fichier sladp.conf je ne peut pas avoir acces a ce fichier ce qui est conpréhensible puisque je suis stagiaire.

    Mais en tous cas je te remercie pour tes idées.

  9. #9
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Avec quel utilisateur LDAP vous connectez-vous ? Le même utilisateur pour toutes vos opérations ou celui de l'utilisateur qui se connecte ?

    A priori vous êtes dans le premier cas et vu les messages d'erreur que vous obtenez vous êtes plutôt limités. Vous devriez faire une demande à votre tutorant pour qu'il revoit les ACL en conséquence ou vous attribue un autre compte. Toutefois, il serait certainement préférable d'avoir un annuaire de test dans un premier temps pour ne pas interférer avec l'existant et vous permettrait de le configurer selon vos propres besoins (il existe un portage - non officiel - de OpenLDAP pour Windows).

  10. #10
    Membre habitué
    Inscrit en
    Mai 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 14
    Par défaut
    Bin en faite le but de mon projet est de créer un systeme de sécurité pour les application intranet en php permettant de verifier quel compte utilisateur est connecter de vérifier s'il fait partie du groupe profs et ainsi de rentré si celui ci en fait bien partie.

    Pour aboutir a cela en faite j'ai céer un petit formulaire permettant a l'utilisateur de rentré son login et son mot de passe ainsi je verifie si son login est dans le group profs et ensuite si celui ci en fa bien partie je récupere le mot de passe et le crypt au format de open ldap et la intervient ma fonction ldap_compare ou je verifie donc la chaine de caractere ( mot de passe crypter saisi par l'utilisateur sur le formulaire) avec le mot de passe enregistrer dans l'annuaire.

    Dans un premier je me connectais avec la fonction ldap_bind en utilisateur anonyme car j'avai seulement besoin de lire l'annuaire, puis j'ai eu l'erreur que j'ai décrit dans mon premier post alors je me suis connecter en admin (toujours grace a ldap_bind ) sur le serveur pour obtenir tous les droit de verification mais l'erreur est rester donc je ne comprend pas.

    Voila une partie de mon code au as ou j'aurai mal expliquer.
    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
    67
    68
    69
    70
    71
    72
    73
    74
    <?php
    $log='uid=admin,ou=XXXXXXXX,ou=XXXXXXXX,ou=XXXXXXX,ou=XXXXXX,o=gouv,c=fr';
    $pass = "XXXXXXXXXX";
    	$auth = 0;
    	echo "<center><p><form action ='teste2.php' method ='POST'></p>
    	   Login :<input type=text name ='uidd'><br>
    	   Password :<input type=text name ='Pass'><br>
    	   <input type=submit value='Valider'></center><br><br><br>";
     
    	if(isset($_POST['uidd']))
    	{
    		$uid = $_POST['uidd'];
    		$ds = ldap_connect('XXX.XXX.XXX.XXX') or die($php_errormsg);
    		ldap_bind($ds, $log, $pass) or die($php_errormsg);
    		$sr = ldap_search($ds,'ou=XXXXXXXX,ou=XXXXXXXX,ou=XXXXXXX,ou=XXXXXX,o=gouv,c=fr','cn=profs')or die($php_errormsg);
    		$e = ldap_get_entries($ds, $sr) or die($php_errormsg);
    		echo '<br><br><br><br>';
    		$nbr = count($e[0]['memberuid']);
    		for ($i = 1; $i < $nbr-1; $i++)
    		{
    			$uidd = $e[0]['memberuid'][$i];
    			if ($uidd == $uid)
    			{
    				if($_POST['Pass']=="")
    				{ // cas du mot de passe vide
    					echo "pas de Mot de Passe saisie , Veuillez recommencer";
    					break;
    				}
    				$value = m2p_ftp($_POST['Pass']);
    				$attr = "userPassword";
    				$dn = "ou=XXXXXXXX,ou=XXXXXXX,ou=XXXXXXXX,ou=XXXXXXXX,o=gouv,c=fr";
    	        // comparaison des valeurs
    				$r=ldap_compare($ds, $dn, $attr, $value);
    				if ($r === -1) {//atribution de $auth en f(des resultat)
    					echo "Erreur : ".ldap_error($ds);
    				} elseif ($r === TRUE) {
    					$auth = 1; //  mdp correct et session == prof
    				} elseif ($r === FALSE) {
    					$auth = 2; //  mdp incorrect et session == prof
    				}
    			}
    				//echo $e[0]['memberuid'][$i].'<br>';
    		}
    		ldap_close($ds)or die($php_errormsg);
     
    		//affichage du resultat en f($auth)
    		switch($auth)
    		{
    			case 1:
    				echo "Vous faite partie du groupe prof";
    				break;
     
    			case 2:
    				echo "Profs mais mauvais mot de passe";
    				break;
     
    			default:
    				echo "vous ne pouvez acceder a cet interface";
    				break;
    		}
    	}
     
    ?>
     
     
     
    <?php
    function m2p_ftp($m2p) 
    {
        $prefix = "{CRYPT}";
        $nbAl = substr("$m2p[Value]", 0, 12);
        $pwd = $prefix.crypt($m2p,$nbAl);
      return $pwd;
    }
    Désoler pour les' 'XXXXXXXXXXX' un pe partout mais je pense que mon maitre de stage ne voudrai pas que je diffsue ces informations

  11. #11
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Et le reste du script s'exécute normalement (comme vous vous y attendez) ? Avez-vous tenté de spécifier que vous souhaitiez utiliser la version 3 du protocole via ldap_set_option ?

  12. #12
    Membre habitué
    Inscrit en
    Mai 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 14
    Par défaut
    oui tous le reste du code fonctionne normalement sans aucun probleme.

    Je n'ai pas essayé de changer la version du protocole j'essairais demain car je suis rentré chez moi!
    Je vous tien au courant des nouvellles

  13. #13
    Membre habitué
    Inscrit en
    Mai 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 14
    Par défaut
    Bonjours julp,

    J'ai donc enfin essayer de modifier la version du protocole mais lerreur apparait encore...

    :'( Je commence a desepéré

  14. #14
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Vous faites référence à quelle erreur maintenant (ldap_bind ou ldap_compare) ?

    Par contre vous auriez pu faire un code beaucoup plus efficace en utilisant directement un scope de type base (ldap_read) puisque le DN du groupe est connu. Autre point, n'y a-t-il pas une erreur au niveau du DN utilisé lors de ldap_compare ?

    Voilà ce que j'ai écrit et testé de mon côté :
    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
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    <?php
    define('LDAP_HOST', '192.168.100.4');
    define('MANAGER_DN', 'cn=manager,dc=developpez,dc=com');
    define('MANAGER_PWD', 'secret');
    define('GRP_PROFS_DN', 'cn=LdapUsers,ou=Groupes,dc=developpez,dc=com');
    define('UTIL_BASE_DN', 'ou=Utilisateurs,dc=developpez,dc=com');
     
    function check_password($crypted_pwd, $plain_pwd)
    {
        if (preg_match('/{([^}]+)}(.*)/', $crypted_pwd, $cypher)) {
            $crypted_pwd = $cypher[2];
            $cypher = strtolower($cypher[1]);
        } else {
            $cypher = NULL;
        }
     
        switch ($cypher) {
            case 'crypt':
                if (preg_match("/^\\$2+/", $crypted_pwd)) {
                    if (!defined('CRYPT_BLOWFISH') || CRYPT_BLOWFISH == 0) {
                        die('Your system crypt library does not support blowfish encryption.');
                    }
                    list(, $version, $rounds, $salt_hash) = explode('$', $crypted_pwd);
                    return (crypt($plain_pwd, '$'. $version . '$' . $rounds . '$' .$salt_hash) == $crypted_pwd);
                } elseif (strstr($crypted_pwd, '$1$')) {
                    if (!defined('CRYPT_MD5') || CRYPT_MD5 == 0) {
                        die('Your system crypt library does not support md5crypt encryption.');
                    }
                    list(, $type, $salt, $hash) = explode('$', $crypted_pwd);
                    return (crypt($plain_pwd, '$1$' .$salt) == $crypted_pwd);
                } elseif (strstr($crypted_pwd, '_')) {
                    if (!defined('CRYPT_EXT_DES') || CRYPT_EXT_DES == 0) {
                        die('Your system crypt library does not support extended DES encryption.');
                    }
                    return (crypt($plain_pwd, $crypted_pwd) == $crypted_pwd);
                } else {
                    return (crypt($plain_pwd, $crypted_pwd ) == $crypted_pwd);
                }
                break;
            default:
                die("Algorithme non implémenté");
                break;
        }
    }
     
    function member_of($ldapc, $groupe, $uid)
    {
        $sr = ldap_read($ldapc, $groupe, sprintf('(memberuid=%s)', $uid))/* or die($php_errormsg)*/;
        if (!$sr) {
            return FALSE;
        }
        $count = ldap_count_entries($ldapc, $sr);
        ldap_free_result($sr);
     
        return $count === 1;
    }
     
    function find_user_by_uid($ldapc, $base, $uid)
    {
        $sr = ldap_list($ldapc, $base, sprintf('(uid=%s)', $uid), array('dn', 'userpassword'))/* or die($php_errormsg)*/;
        if (!$sr) {
            return FALSE;
        }
        if (ldap_count_entries($ldapc, $sr) > 1) {
            ldap_free_result($sr);
            return FALSE;
        }
        $r = ldap_get_entries($ldapc, $sr);
        ldap_free_result($sr);
        return array('dn' => $r[0]['dn'], 'userpassword' => $r[0]['userpassword'][0]);
    }
     
    echo '<center><form method="POST">
        Login :<input type="text" name="uidd"><br/>
        Password :<input type="password" name="pass"><br/>
        <input type="submit" value="Valider"></form></center><br/><br/><br/>';
     
    if (!empty($_POST['uidd']) && isset($_POST['pass']))
    {
        $uid = $_POST['uidd'];
        $ds = ldap_connect(LDAP_HOST) or die($php_errormsg);
        ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
        ldap_bind($ds, MANAGER_DN, MANAGER_PWD) or die($php_errormsg);
        if (member_of($ds, GRP_PROFS_DN, $uid)) {
            $util = find_user_by_uid($ds, UTIL_BASE_DN, $uid);
            if ($util) {
                if (check_password($util['userpassword'], $_POST['pass'])) {
                    echo 'OK';
                } else {
                    echo "Mot de passe incorrect";
                }
            } else {
                 echo "Cet utilisateur n'existe pas ou plus";
            }
        } else {
            echo "Ne fait pas partie des profs";
        }
        ldap_close($ds) or die($php_errormsg);
    }
    ?>

  15. #15
    Membre habitué
    Inscrit en
    Mai 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 14
    Par défaut
    Ton code fonctionne a première vu trés bien je t'en remercie.

    Mais une petite erreur me chiffonne a chaque fois que je doit verifier le mot de passe il me met le cas d'erreur Algorithme non implementé et je ne sait pas pourquoi.

  16. #16
    Membre habitué
    Inscrit en
    Mai 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 14
    Par défaut
    en faite j'ai trouver le probleme c'est que la variable $utils que tu utilise pour stocker les resultat de la recherche de personnes ne contient pas le mot de passe comme desiré j'ai réussi a afficher le tableau util mais le champs userpassword est vide...

  17. #17
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    En vous connectant à l'annuaire avec un autre client (LDAPBrowser, phpldapadmin, ldapsearch, etc) sous le même utilisateur y avez-vous accès ? Qu'en pense votre tuteur ? (on en revient probablement aux ACL)

  18. #18
    Membre habitué
    Inscrit en
    Mai 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 14
    Par défaut
    Oui moi aussi je pense que cela vien des ACL car ici nous utilisons 2 autre logiciel ou l'on doi s'identifier grace a la base ldap ( GRR, et GLPI) donc je pense moi aussi que la cause vien des ACLs je vais verifié cela dans la journer( car je doit voir sa avec mon tuteur)

  19. #19
    Membre habitué
    Inscrit en
    Mai 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 14
    Par défaut
    J'ai une derniere question a te poser a propos des ACL j'ai réussi a y avoir acces mais je ne sait pas trop quel ligne rajouter donc je prefere avoir ton avis dessus

    Entre :
    - by admin_Dn compare
    - bye admin_Dn read

    Lequel devrais utiliser et es ce que la syntaxe est exact
    (je prefere etre sur j'ai pas vrraiment envie de planter le serveur de l'école )

  20. #20
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Sachez que vous trouverez une documentation déjà bien fournie sur le site d'OpenLDAP.

    read vous permet de faire tout en une fois : recherche et lecture du résultat (ça correspond au code que je vous ai proposé). compare, va vous demander une étape supplémentaire car vous n'aurez pas l'attribut userPassword dans le résultat de la recherche donc il faudra ensuite utiliser ldap_compare sur le DN de l'objet correspondant (normalement vous n'en avez qu'un) à la recherche (c'est plus ou moins votre idée de départ).

    Par contre vous n'avez pas donné l'autre bout de l'ACL (access to attrs=userPassword).

Discussions similaires

  1. [LDAP] PHP et requêtage AD
    Par villegente dans le forum Bibliothèques et frameworks
    Réponses: 7
    Dernier message: 17/04/2008, 03h24
  2. [LDAP] PHP export LDAP
    Par el kafard dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 12/09/2007, 11h57
  3. Réponses: 8
    Dernier message: 29/09/2006, 14h40
  4. [Mail] LDAP-PHP / Recherche sur 2 branches "OU"
    Par Yoshi_da_f..k dans le forum Langage
    Réponses: 5
    Dernier message: 29/09/2006, 13h30
  5. [LDAP] Problème de liaison entre LDAP/PHP/Oracle
    Par rochenico dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 13/09/2006, 16h56

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