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 19/02/2008, 14h02   #1
Membre à l'essai
 
Inscription : septembre 2003
Messages : 79
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 79
Points : 24
Points : 24
Par défaut [LDAP] Authentification LDAP

Bonjour

je viens vers vous car j'essaye de créer une petite interface web , demandant login et passwd pour pouvoir acceder a la partie espace réservé.

pour cela j'avais commencé a faire une page interfacée avec MySQL, ca marchait tres bien !!!

maintenant on me demande de faire la meme chose mais avec un LDAP.

j'ai donc créé mon formulaire :
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
<div id="Layer1">
      <form name="form1" method="POST" action="logldap2.php">
  <table width="305"  align="left" class="news_box">
    <tr bgcolor=""> 
      <td height="17" colspan="2" valign="top"> 
      <td valign="top">    </tr>
    <tr bgcolor="">
      <td height="3" colspan="3" valign="top"><h1 align="center">Authentification n&eacute;cessaire </h1>    </tr>
    <tr bgcolor="">
      <td height="0" colspan="3" valign="top">        </tr>
    <tr bgcolor="">
      <td height="1" colspan="3" valign="top">        </tr>
    <tr bgcolor="">
      <td height="8" valign="top"><p>&nbsp;</p>
      <td valign="top">Login:
      <td valign="top"><input type="text" name="login" />            </tr>
    <tr bgcolor=""> 
      <td height="34" align="left" valign="top"> 
        <p>&nbsp;</p>            
      <td height="34" align="left" valign="top">Mot de passe:
      <td height="34" align="left" valign="top"><input type="password" name="motDePasse" />    </tr>
    <tr> 
      <td height="35" colspan="2" rowspan="2">
      <td height="16"><input type="submit" name="verif" value="verification" />    </tr>
    <tr>
      <td height="17"></tr>
  </table>
 
</form>

puis ma page lohldap2.php:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
<?
//connexion a LDAP
$server="192.168.0.10";
$port="389";
$dn="dc=societe,dc=fr";
$log=$_POST['login'];
$rootpw=$_POST['motDePasse'];
$rootdn="cn=".$log.",$dn";
 
$uid = $log;
 
//tentative de connexion
$ds=ldap_connect($server,$port); 
 
//version du protocole utilisé si v2 marche pas
ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
 
//verification log et motdepasse
$r=ldap_bind($ds,$rootdn,$rootpw)or die ("Impossible de se connecter au serveur ! \n");
echo "Authentification sur le serveur OpenLDAP -> OK \n\n";
 
?>
ca ca fonctionne avec le "Manager" dircetment inscrit dans slapd.conf;
par contre mes users dans mon annuaire ne peuvent pas acceder à la page d'apres; il me met cette erreur:

Code :
1
2
Warning: LDAP: Unable to bind to server: Invalid credentials in c:\program files\easyphp\www\test\site_l2e\logldap2.php on line 16
Impossible de se connecter au serveur
d'apres le message c 'est un pb de motde passe puisqu'il va chercher "Manager" dans slapd.conf.
Dois-je rajouter une ligne dans slapd.conf pour lui dire de verifier mes users ?

merci d'avance
lolodelp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2008, 22h49   #2
Membre à l'essai
 
Inscription : septembre 2003
Messages : 79
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 79
Points : 24
Points : 24
j'ai essayé de rajouter $user et $uid, mais ca ne fonctionne toujours pas

je continue de chercher
lolodelp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/02/2008, 00h55   #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
Le message d'erreur me paraît clair Quel est le DN réel de l'utilisateur employé pour ce test ?
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/02/2008, 23h47   #4
Membre à l'essai
 
Inscription : septembre 2003
Messages : 79
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 79
Points : 24
Points : 24
bonsoir, tous d'abord merci de m'aider

le DN réel est : dc=societe,dc=fr

en fait dans mon script il recherche une personne fesant partie de societe.fr
mais je viens de m'apercevoir que cela est peut etre important de préciser de lui dire de chercher aussi dans l'ou puisque jai ecrit mon script de maniere a ce qu'il cherche dans :
Code :
cn=$_POST['login'],dc=societe,dc=fr
je pourrais peut etre preciser la recherche dans ma base DN
Code :
ou=PersonneL,dc=societe,dc=fr
je vais essayer

J'ai importé mes users depuis une base NIS, ce qui fait que maintenant ce sont des'uid' et pas des 'cn' comme lors de la création d'un user..je sais pas si c'est important
lolodelp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2008, 00h01   #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
J'ai bien compris que dc=societe,dc=fr correspondait à votre racine. Il faudrait en réalité déjà connaître le DN exact de l'utilisateur pour que le bind (authentification) fonctionne. Les attributs Common Name comme uid pouvant être indépendamment employé comme RDN, d'où ma question.
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2008, 13h05   #6
Membre à l'essai
 
Inscription : septembre 2003
Messages : 79
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 79
Points : 24
Points : 24
je suis désolé d'etre aussi novice mais je ne vois pas tres bien, ce que vous voulez dire , je croyais que le dn exact etait la racineen developpant mon arbre dans openldap, et en cliquant sur mon user, jai ceci:
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
 
**************************************************
Nom distingué: cn=lolo,o=permanents,ou=PersonneL,dc=societe,dc=fr
 
**************************************************
cn requis, rdn  
lolodelp
(renommer) 
*****************
gidNumber requis 
0 
root ()
*****************   
lolo 
givenName  
(ajouter une valeur) 
*****************
homeDirectory requis 
/home/lolo 
*****************
loginShell
/bin/csh  
*****************   
objectClass requis 
   (structurel)
PosiXAccount
Top
(ajouter une valeur) 
*****************
sn requis 
LOLODELP
(ajouter une valeur) 
******************
uidNumber requis 
1000
****************** 
User Name alias, requis 
llolo
(ajouter une valeur) 
******************
userPassword
monmdp
******************
je ne sais pas si ca peut aider !! normalement tous mes users font partie de cette racine !!
lolodelp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2008, 13h26   #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
Essayez d'utiliser cn=lolo,o=permanents,ou=PersonneL,dc=societe,dc=fr lors du bind (comme valeur du deuxième paramètre). Donc le code initial :
Code :
$rootdn="cn=".$log.",$dn";
Devait aboutir à la construction d'un DN erroné.

Chaque objet (la racine en est un), possède un DN (nom distingué). C'est ce qui permet de l'identifier de manière unique et de le situer.
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2008, 16h06   #8
Membre à l'essai
 
Inscription : septembre 2003
Messages : 79
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 79
Points : 24
Points : 24
ca avance un peu mieux :
En effet en trifouillant mon code je suis arrivé a récupérer mon user uniquement par le login en tapant ce code :
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
<html>
<head>
<title>AUTHENTIFICATION LDAP</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style>
BODY {
font-family: Verdana, Arial, Helvetica;
font-size: 12px;
}
 
P {
font-family: Verdana, Arial, Helvetica;
font-size: 12px;
}
</style>
</head>
 
<body>
<h3>AUTHENTIFICATION LDAP </h3>
<p>
<form action="<? PHP_SELF ?>" method="post" name="form1">
<b>Login:</b><br>
<input type="text" name="login" size="30" maxlength="100" />
<input type="password" name="password" size="30" maxlength="100"/>
<br>
<input type="submit" value="go">
</form>
</p>
<?
$u = $_POST["login"];
$p = $_POST["password"];
 
$baseDN = "dc=societe,dc=fr";
$ldapServer = "192.168.0.10";
$ldapServerPort = 389;
$dn = 'o=permanents,ou=PersonneL,dc=societe,dc=fr';
 
echo "Connexion au serveur <br />";
$conn=ldap_connect($ldapServer);
 
// on teste : le serveur LDAP est-il trouvé ?
if ($conn)
 echo "Le résultat de connexion est ".$conn ."<br />";
else
 die("connexion impossible au serveur LDAP");
 
// On dit qu'on utilise LDAP V3, sinon la V2 par défaut est utilisé
// et le bind ne passe pas. 
if (ldap_set_option($conn, LDAP_OPT_PROTOCOL_VERSION, 3)) {
    echo "Utilisation de LDAPv3 \n";
 } else {
    echo "Impossible d'utiliser LDAP V3\n";
    exit;  }
 
$bindServerLDAP=ldap_bind($conn);
 
print ("Liaison au serveur : ". ldap_error($conn)."\n");
// en cas de succès de la liaison, renvoie Vrai
if ($bindServerLDAP)
  echo "Le résultat de connexion est $bindServerLDAP <br />";
else
  die("Liaison impossible au serveur ldap ...");
 
/*on effectue une recherche anonyme, avec le dn de base*/
 
echo "Recherche suivant le filtre (sn='$u') <br />";
$query = "uid=".$u;
$mdp=$p;
$result=ldap_search($conn, $baseDN, $query);
echo "Le résultat de la recherche est $result <br />";
 
$nb = ldap_count_entries ($conn,$result);
echo "Nombre d'entrées retournées : ".$nb;
 
echo "Lecture de ces entrées ....<p />";
$info = ldap_get_entries($conn, $result);
echo "Données pour ".$info["count"]." entrées:<p />";
 
for ($i=0; $i < $info["count"]; $i++) {
        echo "premiere entree cn : ". $info[$i]["cn"][0] ."<br />";
        echo "premier email : ". $info[$i]["mail"][0] ."<p />";
}
/* clôture de la session  */
echo "Fermeture de la connexion";
ldap_close($conn);
?>
ca fonctionne mais cela ne verifie pas le couple login et mdp , comment puis je lui dire de verifier le login et password ?
lolodelp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2008, 16h23   #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
Si vous passez ldap_bind (retour d'une valeur vraie) alors l'utilisateur (enfin son DN) et son mot de passe sont corrects. Une autre façon d'aborder, l'authentification (je ne sais pas si c'est ce que vous cherchez) consiste à utiliser un compte "proxy" chargé de faire ces vérifications (via ldap_compare notamment dans le but de vérifier que l'utilisateur de DN X a bien pour mot de passe Y - je vous recommande tout de même de ne pas stocker les mots de passe en clair). Tout dépend comment vous voulez concevoir votre application.

Deux petites remarques quant à la syntaxe de votre code :
  • PHP_SELF n'est pas une constante, PHP devrait d'ailleurs générer un joli notice. La syntaxe correcte est $_SERVER['PHP_SELF']
  • Les balises courtes (<? et <?=) sont vivement déconseillées pour des raisons de portabilité (à, respectivement, préférer : <?php et <?php echo)
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h09.


 
 
 
 
Partenaires

Hébergement Web