6.Le langage PHP
6.16.LDAP
6.16.3.Accès via les fonctions de l'extension ldap
6.16.3.3.L'accès en lecture (recherche d'objets)
6.16.3.3.1.Introduction
Une fois connecté
[comment?], l'accès aux données LDAP se fait en deux temps:
- Une première fonction ldap_search() permet de lancer la recherche
- Une seconde fonction ldap_get_entries() permet d'accéder aux résultats
|
6.16.3.3.2.ldap_search
En plus de la ressource LDAP (issue de l'appel à
ldap_connect()), la requête nécessite de préciser 2 paramètres:
- La branche LDAP sur laquelle doit s'effectuer la recherche (ex: ou=redacteurs, dc=phpfacile, dc=com)
- Le filtre de recherche (ex: "(sn=Dupond)" pour rechercher les dénommés Dupond, "(uid=jdupond)" pour rechercher par l'identifiant POSIX)
|
<?php
// Extrait de code (on suppose l'authentification préalablement établie)
// $ldap est la valeur retour de ldap_connect()
$requete = ldap_search($ldap,
'ou=redacteurs,dc=phpfacile,dc=com',
'(uid=jdupond)');
if (false === $requete) die('La recherche a échoué');
// Reste à récupérer les résultats
?>
La fonction retourne une ressource de recherche ou false en cas d'erreur.
Par défaut, c'est l'ensemble des attributs qui est retourné. Par conséquent, en pratique, c'est plutôt un minimum de 3 paramètres qui sont passés, le 3ème paramètre étant la liste (sous forme de tableau) des attributs à retourner (ex: ['sn', 'givenname'] pour retourner nom et prénom).
6.16.3.3.3.ldap_get_entries
Pour consulter les résultats de la requête LDAP, il suffit de passer en paramètre de la function
ldap_get_entries() à la fois la ressource LDAP (réponse de
ldap_connect()) et la ressource de requête LDAP (réponse de
ldap_search()).
La fonction
ldap_get_entries() retourne un tableau (à la fois indexé et associatif) qui contient les clés et valeurs suivantes:
-
count: le nombre de réponses
- Les index de 0 à count-1: un tableau (associatif et indexé) décrivant la n-ième réponse qui contient:
-
count: le nombre d'attributs retourné pour la réponse
- le nom des attributs (en minuscules): associés chacun à un tableau contenant:
-
count: le nombre de valeurs de l'attributs
- Les index de 0 à count-1: les valeurs de l'attribut
|
- Les index de 0 à count-1: le nom (en minuscules) du n-ième attribut retourné
|
|
La réponse ressemble donc à (cas avec une seule réponse)
array(2) {
'count' =>
int(1)
[0] =>
array(4) {
'uid' =>
array(2) {
'count' =>
int(1)
[0] =>
string(7) "jdupond"
}
'sn' =>
array(2) {
'count' =>
int(1)
[0] =>
string(6) "Dupond"
}
'givenname' =>
array(2) {
'count' =>
int(1)
[0] =>
string(4) "Jean"
}
[0] =>
string(3) "uid"
[1] =>
string(2) "sn"
[2] =>
string(9) "givenname"
'count' =>
int(3)
'dn' =>
string(48) "cn=Dupond Jean,ou=redacteurs,dc=phpfacile,dc=com"
}
}
|
- Comme on peut le voir, la réponse de ldap_get_entries() autorise la récupération des valeurs des attributs multivalués.
- Pour toutes les réponses, l'attribut dn est systématiquement retourné (mais n'apparaîtra pas nécessairement dans le tableau indexé des noms des attributs retournés).
|
6.16.3.3.4.Exemple complet
Il est donc possible d'afficher l'ensemble des résultats de la requête avec un code similaire au suivant:
<?php
$ldapURL = 'ldap.forumsys.com';
$ldapPort = 389; // Port par défaut = 389
$ldapVersionProtocole = 3; // Version par défaut = 2
$ldapIdentifiant = 'cn=read-only-admin,dc=example,dc=com';
$ldapMotDePasse = 'password';
// Connexion
$ldap = ldap_connect($ldapURL, $ldapPort);
if (false === $ldap) die('Echec de la connexion');
ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, $ldapVersionProtocole);
$retour = ldap_bind($ldap, $ldapIdentifiant, $ldapMotDePasse);
if (false === $retour) die('Echec de l\'authentification (ou de la connexion)');
// Recherche
$requete = ldap_search($ldap,
'dc=example,dc=com',
'(uid=curie)',
['uid', 'sn', 'givenname']);
if (false === $requete) die('La recherche a échoué');
// Parcours du résultat de la recherche
$resultats = ldap_get_entries($ldap, $requete);
for ($i = 0; $i < $resultats['count']; $i++) {
echo 'Réponse '.$i.' ('.$resultats[$i]['dn'].')'."\n";
for ($j = 0; $j < $resultats[$i]['count']; $j++) {
$nomAttribut = $resultats[$i][$j];
echo ' L\'attribut '.$j.' ('.$nomAttribut.') a pour valeur(s):'."\n";
for ($k = 0; $k < $resultats[$i][$nomAttribut]['count']; $k++) {
echo ' '.$resultats[$i][$nomAttribut][$k]."\n";
}
}
}
?>
<?php
$ldapURL = 'ldap.forumsys.com';
$ldapPort = 389; // Port par défaut = 389
$ldapVersionProtocole = 3; // Version par défaut = 2
$ldapIdentifiant = 'cn=read-only-admin,dc=example,dc=com';
$ldapMotDePasse = 'password';
// Connexion
$ldap = ldap_connect($ldapURL, $ldapPort);
if (false === $ldap) die('Echec de la connexion');
ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, $ldapVersionProtocole);
$retour = ldap_bind($ldap, $ldapIdentifiant, $ldapMotDePasse);
if (false === $retour) die('Echec de l\'authentification (ou de la connexion)');
// Recherche
$requete = ldap_search($ldap,
'dc=example,dc=com',
'(uid=curie)',
array('uid', 'sn', 'givenname'));
if (false === $requete) die('La recherche a échoué');
// Parcours du résultat de la recherche
$resultats = ldap_get_entries($ldap, $requete);
for ($i = 0; $i < $resultats['count']; $i++) {
echo 'Réponse '.$i.' ('.$resultats[$i]['dn'].')'."\n";
for ($j = 0; $j < $resultats[$i]['count']; $j++) {
$nomAttribut = $resultats[$i][$j];
echo ' L\'attribut '.$j.' ('.$nomAttribut.') a pour valeur(s):'."\n";
for ($k = 0; $k < $resultats[$i][$nomAttribut]['count']; $k++) {
echo ' '.$resultats[$i][$nomAttribut][$k]."\n";
}
}
}
?>
Ce qui pourra donner
Réponse 0 (uid=curie,dc=example,dc=com)
L'attribut 0 (uid) a pour valeur(s):
curie
L'attribut 1 (sn) a pour valeur(s):
Curie
L'attribut 2 (givenname) a pour valeur(s):
Marie