Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks
Bibliothèques et frameworks Forum d'entraide sur les frameworks, templates, bibliothèques de code (PDFLib, eZPdf, JpGraph, Artichow, PEAR, etc). Avant de poster : FAQ bibliothèques, toutes les FAQ PHP et cours bibliothèques
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 29/05/2007, 11h16   #1
Invité de passage
 
Inscription : mai 2007
Messages : 14
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 14
Points : 1
Points : 1
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
DarkstarZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/05/2007, 14h49   #2
Invité de passage
 
Inscription : mai 2007
Messages : 14
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 14
Points : 1
Points : 1
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.
DarkstarZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/05/2007, 17h05   #3
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Ceci est probablement dû aux droits (ACL) qui ne vous permettent pas d'y avoir accès.
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/05/2007, 11h22   #4
Invité de passage
 
Inscription : mai 2007
Messages : 14
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 14
Points : 1
Points : 1
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??
DarkstarZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/05/2007, 11h59   #5
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
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).
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/05/2007, 13h16   #6
Invité de passage
 
Inscription : mai 2007
Messages : 14
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 14
Points : 1
Points : 1
ok je vois maintenant, mais ya t'il un moyen de modifier cela ????? et comment ???
Si tu connais la réponse bien sur
DarkstarZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/05/2007, 13h38   #7
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
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).
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/05/2007, 14h02   #8
Invité de passage
 
Inscription : mai 2007
Messages : 14
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 14
Points : 1
Points : 1
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.
DarkstarZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/05/2007, 14h22   #9
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
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).
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/05/2007, 15h44   #10
Invité de passage
 
Inscription : mai 2007
Messages : 14
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 14
Points : 1
Points : 1
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 :
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
DarkstarZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/05/2007, 17h21   #11
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
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 ?
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/05/2007, 19h50   #12
Invité de passage
 
Inscription : mai 2007
Messages : 14
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 14
Points : 1
Points : 1
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
DarkstarZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/06/2007, 09h26   #13
Invité de passage
 
Inscription : mai 2007
Messages : 14
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 14
Points : 1
Points : 1
Bonjours julp,

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

:'( Je commence a desepéré
DarkstarZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/06/2007, 16h09   #14
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
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 :
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);
}
?>
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/06/2007, 10h08   #15
Invité de passage
 
Inscription : mai 2007
Messages : 14
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 14
Points : 1
Points : 1
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.
DarkstarZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/06/2007, 10h18   #16
Invité de passage
 
Inscription : mai 2007
Messages : 14
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 14
Points : 1
Points : 1
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...
DarkstarZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/06/2007, 11h53   #17
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
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)
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/06/2007, 15h57   #18
Invité de passage
 
Inscription : mai 2007
Messages : 14
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 14
Points : 1
Points : 1
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)
DarkstarZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/06/2007, 10h21   #19
Invité de passage
 
Inscription : mai 2007
Messages : 14
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 14
Points : 1
Points : 1
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 )
DarkstarZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/06/2007, 11h03   #20
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
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).
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h55.


 
 
 
 
Partenaires

Hébergement Web