Aller au contenu

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'attribut
  • modifyAdd : Ajoute des valeurs à un attribut existant
  • modifyDel : 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]);
}