Login LDAP
Utilisation d'un annuaire LDAP pour se connecter à un projet Symfony

Notions théoriques
Un serveur LDAP (Lightweight Directory Access Protocol) est un service qui permet de :
- stocker,
- interroger,
- et gérer des informations dans un annuaire.
Cet annuaire est une base de données spécialisée, généralement utilisée pour organiser et centraliser des données sur :
- des utilisateurs,
- des groupes,
- des ordinateurs,
- et d'autres ressources au sein d'une organisation.
L'annuaire LDAP est structuré sous forme d'un arbre hiérarchique. Chaque entrée dans cet arbre est composée de différents attributs qui représentent des informations spécifiques, comme :
- le nom d'utilisateur (
uid), - l'adresse email (
mail), - le nom complet (
cn), - etc.
- Un serveur LDAP est souvent utilisé pour gérer des informations d'authentification (nom d'utilisateur et mot de passe) dans les entreprises.
- Le protocole LDAP permet aux applications de s'interfacer avec un serveur LDAP pour valider l'identité des utilisateurs et contrôler leurs droits d'accès.
LDAP dans Symfony
Prérequis
- Avoir un serveur LDAP fonctionnel (par exemple OpenLDAP ou Active Directory).
- Un projet Symfony avec le composant Security installé.
Étapes de configuration
1. Installer le composant ldap de Symfony
Symfony dispose d'un composant dédié pour se connecter à un serveur LDAP. Il est nécessaire de l'installer si ce n'est pas déjà fait :
composer require symfony/ldap
2. Configurer les paramètres LDAP dans le fichier config/packages/security.yaml
Voici un exemple de configuration LDAP pour un projet Symfony.
# config/packages/security.yaml
security:
providers:
ldap:
ldap:
service: Symfony\Component\Ldap\Ldap
base_dn: "dc=example,dc=com"
search_dn: "cn=admin,dc=example,dc=com"
search_password: "password"
default_roles: ROLE_USER
uid_key: uid
filter: "(uid={username})"
connection_timeout: 5
firewalls:
main:
anonymous: lazy
provider: ldap
form_login_ldap:
service: Symfony\Component\Ldap\Ldap
dn_string: "uid={username},dc=example,dc=com"
login_path: /login
check_path: /login
access_control:
- { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/, roles: ROLE_USER }
3. Créer le contrôleur de connexion
Créer un contrôleur pour la gestion de la connexion des utilisateurs :
// src/Controller/SecurityController.php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
use Symfony\Component\Routing\Annotation\Route;
class SecurityController extends AbstractController
{
/**
* @Route("/login", name="app_login")
*/
public function login(AuthenticationUtils $authenticationUtils): Response
{
// Récupérer les erreurs de connexion si elles existent
$error = $authenticationUtils->getLastAuthenticationError();
$lastUsername = $authenticationUtils->getLastUsername();
return $this->render('security/login.html.twig', [
'last_username' => $lastUsername,
'error' => $error,
]);
}
/**
* @Route("/logout", name="app_logout")
*/
public function logout(): void
{
// Ce contrôleur peut être laissé vide : il sera intercepté par le firewall Symfony
}
}
4. Créer la vue Twig pour le formulaire de connexion
Dans le répertoire templates/security/login.html.twig, ajouter le formulaire de connexion :
{% extends 'base.html.twig' %}
{% block title %}Login{% endblock %}
{% block body %}
<form method="post" action="{{ path('app_login') }}">
{% if error %}
<div>{{ error.messageKey|trans(error.messageData, 'security') }}</div>
{% endif %}
<label for="username">Username:</label>
<input type="text" id="username" name="_username" value="{{ last_username }}" required>
<label for="password">Password:</label>
<input type="password" id="password" name="_password" required>
<button type="submit">Login</button>
</form>
{% endblock %}
Test de mémorisation/compréhension
TP pour réfléchir et résoudre des problèmes
Objectif :
Le but de ce TP est de configurer un serveur LDAP et de l'intégrer dans un projet Symfony pour authentifier les utilisateurs via cet annuaire.
Vous devrez :
- installer un serveur LDAP localement,
- ajouter des utilisateurs à cet annuaire,
- et configurer Symfony pour qu'il utilise ces utilisateurs lors de l'authentification.
Voici les étapes à suivre :
Étape 1 : Installation de Docker sous Windows (si nécessaire)
Si vous ne l'avez pas encore, installez Docker Desktop pour pouvoir exécuter des conteneurs sur votre machine. Suivez ces instructions :
- Télécharger Docker Desktop : Rendez-vous sur le site officiel de Docker et téléchargez Docker Desktop pour Windows.
- Installer Docker Desktop : Une fois téléchargé, suivez l'assistant d'installation.
- Vérifier le bon fonctionnement : Après l'installation, lancez Docker Desktop et assurez-vous qu'il fonctionne correctement.
Après l'installation de Docker, exécuter docker --version confirme que l'outil est dans le
PATH et opérationnel. Cette vérification rapide évite de diagnostiquer des erreurs bizarres
30 minutes plus tard quand l'outil est simplement absent du terminal.
Étape 2 : Créer un serveur LDAP local
Dans cette étape, vous allez utiliser Docker pour créer un serveur LDAP local.
- Télécharger et démarrer un conteneur OpenLDAP : Trouver une image Docker appropriée et la lancer sur votre machine.
- Définir les variables de configuration : Lors de la création du conteneur LDAP, définissez les paramètres de base (organisation, domaine, mot de passe administrateur).
- Vérifier que le serveur LDAP est opérationnel : Après avoir démarré le conteneur, assurez-vous qu'il est accessible sur le port 389.
L'option --name ldap-service facilite la gestion des conteneurs. Au lieu de mémoriser un ID
hexadécimal, on peut utiliser docker stop ldap-service, docker start ldap-service ou
référencer ce conteneur depuis un autre conteneur (comme phpLDAPadmin) par son nom.
Étape 3 : Ajouter une interface de gestion LDAP
Pour rendre la gestion des utilisateurs plus simple, nous allons utiliser phpLDAPadmin.
- Démarrer un conteneur phpLDAPadmin : Utiliser Docker pour lancer phpLDAPadmin.
- Lier phpLDAPadmin à votre serveur LDAP : Le conteneur phpLDAPadmin doit se connecter à votre serveur OpenLDAP.
- Accéder à l'interface phpLDAPadmin : Ouvrir votre navigateur et se connecter avec les identifiants administratifs.
PHPLDAPADMIN_LDAP_HOSTS=ldap-service utilise le nom du conteneur OpenLDAP comme adresse
réseau. Docker crée automatiquement un réseau interne où les conteneurs se trouvent par leur
nom. C'est plus robuste qu'une adresse IP qui peut changer au redémarrage.
Étape 4 : Création des utilisateurs dans l'annuaire LDAP
Maintenant que votre serveur LDAP est en place, créez des utilisateurs dans l'annuaire.
- Se connecter à phpLDAPadmin : Connexion en tant qu'administrateur à
https://localhost:6443. - Créer de nouvelles entrées utilisateur : Créer des utilisateurs en spécifiant les attributs nécessaires (
uid,cn, mot de passe, etc.). - Vérifier les utilisateurs créés : S'assurer que les utilisateurs sont correctement enregistrés dans l'annuaire LDAP.
La valeur de uid_key dans security.yaml doit correspondre à l'attribut LDAP qui contient
l'identifiant de connexion. Par défaut uid, mais certains annuaires Active Directory utilisent
sAMAccountName. Adapter uid_key à votre configuration LDAP si la connexion échoue.
Étape 5 : Configurer l'authentification LDAP dans Symfony
Vous allez maintenant intégrer votre serveur LDAP dans votre projet Symfony.
- Installer le composant LDAP de Symfony : Installer le composant dédié.
- Configurer
security.yaml: Ajouter le provider LDAP, configurer le firewall et les contrôles d'accès. - Créer le contrôleur de connexion : Route
/loginet formulaire Twig.
Le search_password dans security.yaml est le mot de passe du compte d'administration LDAP.
En production, le stocker dans .env comme variable d'environnement et y référencer via
%env(LDAP_ADMIN_PASSWORD)%. Ne jamais versionner un mot de passe en clair dans un fichier
de configuration.
Étape 6 : Tester la connexion LDAP dans Symfony
Une fois la configuration terminée, tester l'authentification LDAP.
- Démarrer le serveur Symfony : Lancer en mode développement.
- Accéder à la page de connexion : Ouvrir
/logindans le navigateur. - Tester l'authentification : Se connecter avec les identifiants d'un utilisateur LDAP.
- Vérifier les droits d'accès : S'assurer que les rôles sont correctement attribués.
Étape 7 : Debugging et vérification
Si l'authentification ne fonctionne pas comme prévu, voici quelques pistes pour vérifier la configuration :
- Vérifier la configuration LDAP : S'assurer que
base_dn,search_dnet le mot de passe sont corrects. - Vérifier les logs de Symfony : Consulter
var/log/dev.logpour les erreurs. - Tester avec
ldapsearch: Utiliser un outil pour vérifier que le serveur LDAP est accessible et que les utilisateurs existent.
Étape 8 : Bonus - Gestion des rôles dans LDAP
Si vous le souhaitez, aller plus loin en :
- Créant des groupes dans LDAP : Ajouter des groupes (
admin,user, etc.) dans votre serveur LDAP. - Attribuant des rôles basés sur ces groupes : Modifier la configuration de Symfony pour attribuer des rôles en fonction des groupes LDAP.
- Testant les permissions avancées : Vérifier que les utilisateurs avec différents rôles accèdent aux bonnes sections de l'application.
Dans un environnement d'entreprise, LDAP évite de dupliquer les comptes utilisateurs dans chaque application. Un utilisateur qui quitte l'organisation est désactivé une seule fois dans l'annuaire, et perd automatiquement l'accès à toutes les applications configurées avec ce LDAP. C'est le principe du SSO (Single Sign-On).
Une solution
Vous devez être connecté pour voir le contenu.