MLdap
Présentation
MLdap est une surcouche orientée objet pour les fonctions natives PHP LDAP. Elle simplifie l'accès et la manipulation des annuaires LDAP en fournissant une interface plus intuitive que les fonctions natives de PHP.
Cette classe permet de :
- Se connecter à un serveur LDAP
- Effectuer des recherches avec des filtres
- Ajouter, modifier et supprimer des entrées et des attributs
- Gérer l'authentification des utilisateurs
- Traiter les attributs binaires
Prérequis
- L'extension PHP LDAP doit être installée et activée
Connexion au serveur LDAP
use mlib\net\ldap\MLdap;
use mlib\net\ldap\MLdapException;
try {
// Connexion anonyme
$ldap = new MLdap('ldap.mondomaine.com');
// Ou avec authentification
$ldap = new MLdap(
'ldap.mondomaine.com', // Serveur LDAP
389, // Port (par défaut: 389)
'cn=admin,dc=mondomaine,dc=com', // DN de l'utilisateur
'motdepasse' // Mot de passe
);
// Définir la base de recherche par défaut
$ldap->setDefaultBase('ou=utilisateurs,dc=mondomaine,dc=com');
} catch (MLdapException $e) {
echo "Erreur de connexion LDAP : " . $e->getMessage();
}
Recherche d'entrées
Recherche simple
// Rechercher tous les utilisateurs
$resultats = $ldap->search('(objectClass=person)');
// Afficher les résultats
foreach ($resultats as $i => $entree) {
if ($i === 'count') continue;
echo "DN: " . $entree['dn'] . "\n";
echo "Nom: " . $entree['cn'][0] . "\n";
echo "Email: " . ($entree['mail'][0] ?? 'Non défini') . "\n\n";
}
Recherche avec filtres et attributs spécifiques
// Rechercher uniquement les noms et emails des utilisateurs dont le nom commence par 'Dupont'
$filtre = '(&(objectClass=person)(sn=Dupont*))';
$attributs = ['cn', 'mail'];
$resultats = $ldap->search($filtre, $attributs);
Récupérer une entrée par son DN
$utilisateur = $ldap->get('uid=jdupont,ou=utilisateurs,dc=mondomaine,dc=com', ['cn', 'mail', 'telephoneNumber']);
if ($utilisateur) {
echo "Nom complet : " . $utilisateur['cn'][0] . "\n";
echo "Email : " . $utilisateur['mail'][0] . "\n";
}
Gestion des entrées
Ajouter une entrée
$nouvel_utilisateur = [
'objectClass' => ['inetOrgPerson', 'organizationalPerson', 'person', 'top'],
'cn' => ['Jean Dupont'],
'sn' => ['Dupont'],
'givenName' => ['Jean'],
'mail' => ['jean.dupont@exemple.com'],
'userPassword' => ['motdepasse'], // Le mot de passe doit être encodé selon les spécifications du schéma LDAP
'uid' => ['jdupont']
];
$ldap->add('uid=jdupont,ou=utilisateurs,dc=mondomaine,dc=com', $nouvel_utilisateur);
Modifier une entrée
// Modifier l'email et ajouter un numéro de téléphone
$modifications = [
'mail' => ['nouvel.email@exemple.com'],
'telephoneNumber' => ['+33123456789']
];
$ldap->modify('uid=jdupont,ou=utilisateurs,dc=mondomaine,dc=com', $modifications);
Supprimer une entrée
$ldap->delete('uid=jdupont,ou=utilisateurs,dc=mondomaine,dc=com');
Gestion des attributs multi-valués
Ajouter des valeurs à un attribut existant
La méthode modifyAdd permet d'ajouter des valeurs à un attribut multi-valué sans écraser les valeurs existantes.
// Ajouter des adresses email supplémentaires à un utilisateur
$ajouts = [
'mail' => ['jean.dupont@domaine.fr', 'j.dupont@societe.com']
];
$ldap->modifyAdd('uid=jdupont,ou=utilisateurs,dc=mondomaine,dc=com', $ajouts);
// Ajouter plusieurs numéros de téléphone
$numeros = [
'telephoneNumber' => ['+33123456789', '+33612345678']
];
$ldap->modifyAdd('uid=jdupont,ou=utilisateurs,dc=mondomaine,dc=com', $numeros);
Supprimer des valeurs d'un attribut
La méthode modifyDel permet de supprimer des valeurs spécifiques d'un attribut multi-valué.
// Supprimer une adresse email spécifique
$suppressions = [
'mail' => ['ancien.email@exemple.com']
];
$ldap->modifyDel('uid=jdupont,ou=utilisateurs,dc=mondomaine,dc=com', $suppressions);
// Supprimer plusieurs numéros de téléphone
$suppressions = [
'telephoneNumber' => ['+33123456789', '+33612345678']
];
$ldap->modifyDel('uid=jdupont,ou=utilisateurs,dc=mondomaine,dc=com', $suppressions);
Comparaison avec la méthode modify
Il est important de noter la différence entre modify et modifyAdd/modifyDel :
modify: Remplace complètement les valeurs de l'attributmodifyAdd: Ajoute des valeurs à un attribut existantmodifyDel: Supprime des valeurs spécifiques d'un attribut
Exemple de différence :
// Supposons que l'attribut 'mail' contienne : ['user@exemple.com', 'user@domaine.com']
// Avec modify (remplace toutes les valeurs)
$ldap->modify('uid=user,dc=exemple,dc=com', ['mail' => ['nouveau@exemple.com']]);
// Résultat : mail = ['nouveau@exemple.com']
// Avec modifyAdd (ajoute des valeurs)
$ldap->modifyAdd('uid=user,dc=exemple,dc=com', ['mail' => ['autre@exemple.com']]);
// Résultat : mail = ['user@exemple.com', 'user@domaine.com', 'autre@exemple.com']
Authentification des utilisateurs
Configuration de l'authentification
// Configurer les paramètres d'authentification
$ldap->setAuthParameters(
'uid', // Attribut utilisé pour l'authentification (généralement 'uid' ou 'sAMAccountName')
'ou=utilisateurs,dc=mondomaine,dc=com', // Base de recherche
'(objectClass=person)' // Filtre optionnel pour restreindre les utilisateurs autorisés
);
Vérification des identifiants
$login = 'jdupont';
$motdepasse = 'motdepasse';
if ($ldap->authenticate($login, $motdepasse)) {
echo "Authentification réussie !";
} else {
echo "Échec de l'authentification";
}
Gestion des attributs binaires
Récupérer un attribut binaire (comme une photo)
$photo = $ldap->getBinaryAttribute('uid=jdupont,ou=utilisateurs,dc=mondomaine,dc=com', 'jpegPhoto');
if (!empty($photo)) {
file_put_contents('photo.jpg', $photo[0]);
}