Symfony propose un système d’authentification flexible, basé sur les concepts de pare-feu, authentification HTTP et authentification par formulaire. Ce système permet de sécuriser les zones de votre application et de gérer les connexions des utilisateurs.
Pare-feu
Définition
Un pare-feu définit les zones de l’application soumises au système de sécurité. Il agit comme une barrière pour filtrer les requêtes, en fonction de critères tels que les chemins ou les noms de domaine.
Configuration de Base
Exemple de pare-feu protégeant toutes les requêtes :
# config/packages/security.yaml
security:
firewalls:
mon_pare_feu:
pattern: ^/
Ici, toutes les requêtes passant par l’URL /
ou ses sous-routes sont protégées.
Pare-feu pour un sous-domaine
Vous pouvez restreindre l’accès par domaine en combinant pattern
et host
:
firewalls:
mon_pare_feu:
pattern: ^/
host: ma-section\.example\.com
http_basic: ~
Pare-feu pour les ressources statiques
Pour laisser les ressources comme les images ou les scripts accessibles sans authentification, définissez un pare-feu dédié :
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
Authentification HTTP
L’authentification HTTP Basic est une méthode simple et rapide pour protéger une application.
Exemple de Configuration
security:
providers:
mes_utilisateurs:
memory:
users:
user: { password: userpass, roles: ['ROLE_USER'] }
firewalls:
mon_pare_feu:
pattern: ^/
http_basic:
realm: "Accès sécurisé"
Lorsqu’une requête est effectuée, un popup de connexion HTTP apparaît, demandant les identifiants.
Authentification par Formulaire
L’authentification via un formulaire est la méthode la plus utilisée dans les applications web.
Configuration
security:
providers:
mes_utilisateurs:
memory:
users:
user: { password: userpass, roles: ['ROLE_USER'] }
firewalls:
mon_pare_feu:
pattern: ^/
form_login: ~
Création des Routes
Ajoutez les routes nécessaires :
# config/routes.yaml
login_check:
path: /login_check
La route /login_check
est utilisée pour soumettre les informations d’identification.
Contrôleur pour la Page de Connexion
Créez une action pour afficher le formulaire de connexion :
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
class LoginController extends AbstractController
{
#[Route('/login', name: 'login')]
public function index(AuthenticationUtils $auth): Response
{
$erreur = $auth->getLastAuthenticationError();
return $this->render('login/index.html.twig', ['erreur' => $erreur]);
}
}
Template Twig
Le formulaire de connexion ressemble à ceci :
{% extends 'base.html.twig' %}
{% block body %}
{% if erreur %}
<div>{{ erreur.message }}</div>
{% endif %}
<form action="{{ path('login_check') }}" method="post">
<label>Identifiant :</label>
<input type="text" name="_username" />
<br />
<label>Mot de passe :</label>
<input type="password" name="_password" />
<br />
<button type="submit">Connexion</button>
</form>
{% endblock %}
Connexion Automatique des Utilisateurs
Ajoutez une case à cocher « Se souvenir de moi » pour prolonger l’authentification via un cookie.
Configuration
firewalls:
mon_pare_feu:
pattern: ^/
form_login: ~
remember_me:
key: "%secret%"
lifetime: 7776000 # 90 jours
path: /
domain: ~
Ajoutez un champ checkbox dans le formulaire de connexion :
<label>Se souvenir de moi</label>
<input type="checkbox" name="_remember_me" checked="checked" />
Déconnexion des Utilisateurs
Configuration
Ajoutez une directive logout
pour permettre aux utilisateurs de se déconnecter.
firewalls:
mon_pare_feu:
pattern: ^/
form_login: ~
logout: ~
Définissez une route pour la déconnexion dans le fichier des routes :
# config/routes.yaml
logout:
path: /logout
Lorsqu’un utilisateur accède à /logout
, il est automatiquement déconnecté.
Lien de Déconnexion dans Twig
Ajoutez un lien de déconnexion dans vos templates :
<a href="{{ path('logout') }}">Déconnexion</a>
Résumé des Étapes Clés
- Configurer les firewalls pour définir les zones protégées.
- Choisir un type d’authentification (HTTP Basic ou formulaire).
- Gérer les sessions utilisateur avec des options comme « Se souvenir de moi ».
- Ajouter une fonctionnalité de déconnexion.
Ce système modulaire et extensible vous permet d’implémenter une sécurité adaptée à vos besoins.