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
|
- 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);
?>
|
- 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.
|
- 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.