13.Zend Framework 2 et 3

13.8.LDAP

13.8.4.L'accès aux données

13.8.4.1.Recherche par DN

Pour retrouver un objet dans l'annuaire LDAP à partir de son DN vous pouvez faire appel à la méthode getEntry() de l'objet Ldap[en savoir plus] instancié précédemment, avec pour paramètres:
  • Le DN de l'objet (sous forme de chaîne de caractères ou d'objet \Zend\Ldap\Dn)
  • La liste des attributs (optionnel) sous forme d'un tableau indexé ayant pour valeurs les noms (peu importe la casse) des attributs à retourner (par défaut tous les attributs sont retournés)
  • Un boolean (optionnel) à positionner à true si l'on souhaite qu'une exception soit levée si l'objet n'est pas trouvé (à false par défaut)
Cette méthode retourne un tableau associatif avec pour clé le nom de l'attribut (en minuscules) et pour valeurs le tableau (indexé) des valeurs de l'attribut (excepté dans le cas du champ dn où ce n'est pas un tableau de valeurs qui est retourné mais une chaîne de caractères correspondant à l'unique valeur possible).
<?php
// A priori ce bout de code devrait faire partie d'un projet plus global qui
// inclus déjà la bibliothèque zend-ldap (le "require_once" qui suit devrait
// être inutile voire pourrait poser problème).
// Mais pour utiliser cet exemple seul, il convient de faire l'include
// nécessaire. Ce qui dans le cas d'une installation de zend-ldap via composer
// peut se faire avec la ligne suivante (adapter le chemin au besoin)
require_once('vendor/autoload.php');
use Zend\Ldap\Ldap;

$params = [
    'host' => 'ldap.forumsys.com',
    'port' => 389, // Port par défaut = 389
    'username' => 'cn=read-only-admin,dc=example,dc=com',
    'password' => 'password',
    'baseDn' => 'dc=example,dc=com'
];
$ldap = new Ldap($params);
$resultat = $ldap->getEntry('uid=curie,dc=example,dc=com');
var_dump($resultat);
?>
<?php
// A priori ce bout de code devrait faire partie d'un projet plus global qui
// inclus déjà la bibliothèque zend-ldap (le "require_once" qui suit devrait
// être inutile voire pourrait poser problème).
// Mais pour utiliser cet exemple seul, il convient de faire l'include
// nécessaire. Ce qui dans le cas d'une installation de zend-ldap via composer
// peut se faire avec la ligne suivante (adapter le chemin au besoin)
require_once('vendor/autoload.php');
use Zend\Ldap\Ldap;

$params = array(
    'host' => 'ldap.forumsys.com',
    'port' => 389, // Port par défaut = 389
    'username' => 'cn=read-only-admin,dc=example,dc=com',
    'password' => 'password',
    'baseDn' => 'dc=example,dc=com'
);
$ldap = new Ldap($params);
$resultat = $ldap->getEntry('uid=curie,dc=example,dc=com');
var_dump($resultat);
?>
pourra retourner quelque chose comme:
  array(2) {
    ["dn"]=>
    string(32) "uid=curie,dc=example,dc=com"
    ["sn"]=>
    array(1) {
      [0]=>
      string(5) "Curie"
    }
    ["givenname"]=>
    array(1) {
      [0]=>
      string(5) "Marie"
    }
  }

13.8.4.2.Recherche par filtre

D'une manière général, la recherche dans l'annuaire LDAP se fait par l'appel à la méthode search() de l'objet Ldap[en savoir plus] instancié précédemment. On y passera en paramètre au moins un filtre de recherche LDAP (ex "(sn=dupond)" pour rechercher les dénommés dupond).
Par défaut, la recherche s'effectue dans la branche précisée par le paramètre baseDn au moment de l'instanciation de l'objet Ldap[en savoir plus]. Si la recherche doit s'effectuer dans une autre branche (ou si tout bonnement ce paramètre n'a pas été précisé au moment de l'instanciation) alors vous devrez préciser le DN de la branche sur laquelle doit s'effectuer la recherche dans le second paramètre de la méthode.
Cette méthode retourne un objet Zend\Ldap\Collection (qui implément les interfaces Iterator et Countable) où chaque élément est un tableau associatif où le nom de la clé est le nom (en minuscule) de l'attribut retourné et où la valeur est, selon les cas:
  • un tableau indexé contenant les différentes valeurs associées à l'attribut (pour les clés autres que "dn")
  • une valeur unique (chaîne de caractères) contenant un DN dans le cas de la clé dn (attribut qui est systématiquement retourné)
rem
  • Un objet Zend\Ldap\Collection implémente l'interface Countable, pour connaître le nombre de résultats vous pouvez donc aussi bien faire appel à la méthode count() ou bien passer cet objet en paramètre de la fonction count() (utilisée classiquement avec les tableaux)
  • Si vous préferrez un retour sous la forme d'un tableau et non pas d'un objet Zend\Ldap\Collection, vous pouvez remplacer l'appel à la méthode search() par un appel à searchEntries() (les 5 premiers paramètres - pour la plupart optionnels - de ces 2 méthodes sont identiques).
Ainsi le code suivant
<?php
// A priori ce bout de code devrait faire partie d'un projet plus global qui
// inclus déjà la bibliothèque zend-ldap (le "require_once" qui suit devrait
// être inutile voire pourrait poser problème).
// Mais pour utiliser cet exemple seul, il convient de faire l'include
// nécessaire. Ce qui dans le cas d'une installation de zend-ldap via composer
// peut se faire avec la ligne suivante (adapter le chemin au besoin)
require_once('vendor/autoload.php');
use Zend\Ldap\Ldap;

$params = [
    'host' => 'ldap.forumsys.com',
    'port' => 389, // Port par défaut = 389
    'username' => 'cn=read-only-admin,dc=example,dc=com',
    'password' => 'password',
    'baseDn' => 'dc=example,dc=com'
];
$ldap = new Ldap($params);
$resultats = $ldap->search('(sn=Curie)');
echo $resultats->count().' résultats trouvés'."\n";
foreach ($resultats as $resultat) {
    var_dump($resultat);
}
?>
<?php
// A priori ce bout de code devrait faire partie d'un projet plus global qui
// inclus déjà la bibliothèque zend-ldap (le "require_once" qui suit devrait
// être inutile voire pourrait poser problème).
// Mais pour utiliser cet exemple seul, il convient de faire l'include
// nécessaire. Ce qui dans le cas d'une installation de zend-ldap via composer
// peut se faire avec la ligne suivante (adapter le chemin au besoin)
require_once('vendor/autoload.php');
use Zend\Ldap\Ldap;

$params = array(
    'host' => 'ldap.mondomaine.com',
    'port' => 389, // Port par défaut = 389
    'username' => 'cn=phpuser,dc=mondomaine,dc=com',
    'password' => 'motDePasseSecret',
    'baseDn' => 'dc=mondomaine,dc=com'
);
$ldap = new Ldap($params);
$resultats = $ldap->search('(sn=Curie)');
echo $resultats->count().' résultats trouvés'."\n";
foreach ($resultats as $resultat) {
    var_dump($resultat);
}
?>
pourra retourner quelque chose comme:
2 résultats trouvés
array(2) {
  ["dn"]=>
  string(28) "uid=mcurie,dc=example,dc=com"
  ["sn"]=>
  array(1) {
    [0]=>
    string(5) "Curie"
  }
  ["givenname"]=>
  array(1) {
    [0]=>
    string(5) "Marie"
  }
}
array(2) {
  ["dn"]=>
  string(28) "uid=pcurie,dc=example,dc=com"
  ["sn"]=>
  array(1) {
    [0]=>
    string(5) "Curie"
  }
  ["givenname"]=>
  array(1) {
    [0]=>
    string(6) "Pierre"
  }
}
Il est possible (et même conseillé) de limiter la liste des attributs retournés en passant pour 4ième paramètre un tableau contenant les noms des attributs (peu importe la casse) à retourner.
<?php
// A priori ce bout de code devrait faire partie d'un projet plus global qui
// inclus déjà la bibliothèque zend-ldap (le "require_once" qui suit devrait
// être inutile voire pourrait poser problème).
// Mais pour utiliser cet exemple seul, il convient de faire l'include
// nécessaire. Ce qui dans le cas d'une installation de zend-ldap via composer
// peut se faire avec la ligne suivante (adapter le chemin au besoin)
require_once('vendor/autoload.php');
use Zend\Ldap\Ldap;

$params = [
    'host' => 'ldap.forumsys.com',
    'port' => 389, // Port par défaut = 389
    'username' => 'cn=read-only-admin,dc=example,dc=com',
    'password' => 'password',
    'baseDn' => 'dc=example,dc=com'
];
$ldap = new Ldap($params);

$attributs = ['givenName'];
$resultats = $ldap->search('(sn=Curie)', null, null, $attributs);
echo $resultats->count().' résultats trouvés'."\n";
foreach ($resultats as $resultat) {
    var_dump($resultat);
}
?>
<?php
// A priori ce bout de code devrait faire partie d'un projet plus global qui
// inclus déjà la bibliothèque zend-ldap (le "require_once" qui suit devrait
// être inutile voire pourrait poser problème).
// Mais pour utiliser cet exemple seul, il convient de faire l'include
// nécessaire. Ce qui dans le cas d'une installation de zend-ldap via composer
// peut se faire avec la ligne suivante (adapter le chemin au besoin)
require_once('vendor/autoload.php');
use Zend\Ldap\Ldap;

$params = array(
    'host' => 'ldap.forumsys.com',
    'port' => 389, // Port par défaut = 389
    'username' => 'cn=read-only-admin,dc=example,dc=com',
    'password' => 'password',
    'baseDn' => 'dc=example,dc=com'
);
$ldap = new Ldap($params);

$attributs = array('givenName');
$resultats = $ldap->search('(sn=Curie)', null, null, $attributs);
echo $resultats->count().' résultats trouvés'."\n";
foreach ($resultats as $resultat) {
    var_dump($resultat);
}
?>
pour ne retourner que
2 résultats trouvés
array(2) {
  ["dn"]=>
  string(28) "uid=pcurie,dc=example,dc=com"
  ["givenname"]=>
  array(1) {
    [0]=>
    string(6) "Pierre"
  }
}
array(2) {
  ["dn"]=>
  string(28) "uid=mcurie,dc=example,dc=com"
  ["givenname"]=>
  array(1) {
    [0]=>
    string(5) "Marie"
  }
}
rem
  • En indiquant null dans le second paramètre de la méthode, on laisse la méthode effectuer la recherche dans la branche indiquée par le paramètre baseDn de l'instanciation de l'objet
  • Nous verrons juste après le rôle du troisième paramètre, lui aussi laissé à null dans cet exemple
Le troisième paramètre de la méthode search() permet de préciser sur quelle étendue doit s'effectuer la recherche. 3 options sont possibles:
  • Zend\Ldap\Ldap::SEARCH_SCOPE_SUB (valeur par défaut) pour faire une recherche sur le DN précisé et sur l'ensemble des éléments fils
  • Zend\Ldap\Ldap::SEARCH_SCOPE_ONE pour faire une recherche sur l'ensemble des fils du DN précisé
  • Zend\Ldap\Ldap::SEARCH_SCOPE_BASE pour faire une "recherche" uniquement sur le DN précisé