13.Zend Framework 2 et 3

13.8.LDAP

13.8.1.Introduction

Ce chapitre ne revient pas en détail sur ce qu'est un annuaire LDAP (ni sur le vocabulaire associé) mais nous vous indiquerons, comment installer et utiliser la bibliothèque zend-ldap (qui s'appuie sur l'extension php ldap) afin de:
  • Se connecter à un annuaire LDAP
  • Retrouver un objet grâce à son DN
  • Effectuer une recherche dans l'annuaire
  • Ajouter un objet
  • Modifier un objet
  • Renommer/Déplacer un objet
  • Supprimer un objet

13.8.2.Installation

13.8.2.1.L'extension ldap

L'utilisation de cette bibliothèque requière l'installation préalable de l'extension ldap. Pour savoir comment procéder nous vous invitons à consulter le chapitre tutoriel ext-ldap.

13.8.2.2.La bibliothèque zend-ldap

Pour récupérer la bibliothèque zend-ldap vous êtes invités à utiliser la commande composer. Pour cela, ajoutez dans la rubrique require du fichier composer.json de votre projet une ligne similaire à
"zendframework/zend-ldap": "^2.5"
puis lancez la commande > composer update
rem
  • Si vous ne disposez pas encore d'un fichier composer.json vous pouvez le créer automatiquement tout en lançant la récupération de la bibliothèque zend-ldap en tapant depuis l'espace racine de votre projet la commande > composer require zendframework/zend-ldap
  • Si vous êtes en PHP 7, cette commande retournera au moins une version 2.8 de zend-ldap

13.8.3.La connexion

13.8.3.1.L'authentification applicative

La connexion (ou plus généralement la déclaration des paramètres de connexion) se fait par l'instanciation d'un objet Zend\Ldap\Ldap avec pour paramètre un tableau contenant (au moins pour une connexion authentifiée à un annuaire OpenLDAP) les clés et valeurs suivantes:
  • host pour préciser l'adresse du serveur LDAP
  • port pour indiquer le port du serveur LDAP (non requis si c'est le port par défaut à savoir 389)
  • username l'identifiant servant à l'authentification (un DN dans le cas d'OpenLDAP ex cn=phpuser,dc=mondomaine,dc=com)
  • password le mot de passe pour l'authentification
<?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',
];
$ldap = new Ldap($params);
?>
<?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',
);
$ldap = new Ldap($params);
?>
rem
  • Cette instanciation a de bonnes chances de ne pas lever d'erreur y compris avec une adresse de serveur LDAP invalide. En effet, la connexion proprement dite ne se fait pas forcément au moment de cet appel mais sur les appels ultérieurs qui nécessitent une réelle communication avec le serveur LDAP (c'est tout du moins ce qu'il se passe avec OpenLDAP 2).
Ces paramètres peuvent être vus comme les paramètres de connexion minimum nécessaires (on suppose qu'une authentification est requise) mais en pratique vous pourriez avoir besoin d'y ajouter d'autres options comme nous le présentons par la suite.
rem
  • En réalité, aucun des paramètres n'est requis mais ne pas les donner à l'instanciation de l'objet c'est s'obliger à faire appel ultérieurement à des méthodes supplémentaires (connect() et bind() notamment) et les passer à cette occasion. Ce qui fait perdre une partie du bénéfice de cette bibliothèque.

13.8.3.2.L'espace de travail

Il peut être utile (voir nécessaire) d'ajouter le paramètre baseDn aux données passées à l'instanciation de l'objet Ldap afin de préciser la branche de l'annuaire LDAP dans laquelle vont par défaut (il restera possible de personnaliser cela au niveau des appels de méthodes) s'effectuer les opérations (de recherche par identifiant notamment). A cette clé doit être associé un DN (ex: "ou=people,cn=mondomaine,cn=com").

13.8.3.3.Les autres paramètres

Parmi les autres paramètres qu'il est possible de passer à l'instanciation de l'object Ldap nous avons également:
  • bindRequiresDn plus particulièrement utile dans le cas d'une authentification utilisateur (et dans le cas OpenLDAP) comme nous le verrons juste après

13.8.3.4.L'authentification utilisateur

Jusque là, nous avons vu les paramètres nécessaires à l'application pour se connecter. Celle-ci se fait, sans intervention de l'utilisateur (et sans interface de saisie) et vous pouvez vous contenter de cette approche (et passer directement au paragraphe suivant si vous le souhaitez) mais vous pourriez également être amenés à effectuer une connexion sur la base des informations (identifiant et mot de passe) saisis par l'utilisateur. Pour cela, vous pouvez envisager, au choix, de:
  • Procéder comme vu précédemment mais l'identifiant seul pourrait ne pas suffir (cas OpenLDAP), vous serez alors contraint de construire un DN complet (ex cn=identifiant, dc=mondomaine, dc=com) à partir de l'identifiant fourni
  • Configurer la connexion LDAP pour permettre une authentification "applicative" (telle que vu précédemment) et laisser la bibliothèque procéder à l'authentification de l'utilisateur directement sur la base des informations qu'il fourni (la bibliothèque se chargeant d'effectuer les traitements nécessaires)
C'est bien évidemment la seconde solution que nous proposons. Vous devrez alors compléter le tableau passé à l'instanciation de l'objet Ldap vu précédemment pour y ajouter:
  • bindRequiresDn booléen qui doit être positionné à true si l'authentification requière un DN (et non pas un simple identifiant d'utilisateur) comme c'est le cas avec OpenLDAP
  • baseDn que nous avons vu précédemment et qui servira comme base pour la recherche de l'utilisateur (afin de récupérer son DN)
Pour que cela fonctionne, il faut que l'utilisateur soit déclaré dans l'annuaire LDAP via un objet posixAccount (dont les champs requis incluent l'uid). L'identifiant fourni par l'utilisateur devra correspondre à cet uid. Ceci permettra à l'application de retrouver le DN de l'utilisateur (dans la branche baseDn) et d'effectuer l'authentification.