Sécuriser les contrôleurs Symfony avec `isGranted` - david-alpha/gdn GitHub Wiki

🔐 Sécuriser les contrôleurs Symfony avec isGranted

Ce guide explique étape par étape comment mettre en place la sécurité dans un projet Symfony (comme github.com/david-alpha/gdn) en utilisant le composant natif isGranted.


⚙️ Étape 1 : Installer le composant de sécurité Symfony

Assurez-vous que le composant security-bundle est installé :

composer require symfony/security-bundle

Cela installera le système de sécurité Symfony et générera un fichier de configuration : config/packages/security.yaml.


🔧 Étape 2 : Configurer le système de sécurité

Modifiez le fichier config/packages/security.yaml avec une configuration de base :

security:
    password_hashers:
        Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface: 'auto'

    providers:
        users_in_memory: { memory: null }

    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false

        main:
            lazy: true
            provider: users_in_memory
            form_login:
                login_path: login
                check_path: login
            logout:
                path: logout
                target: /

    access_control:
        - { path: ^/admin, roles: ROLE_ADMIN }
        - { path: ^/profile, roles: ROLE_USER }

👤 Étape 3 : Créer une entité User

Créez une entité utilisateur qui implémente UserInterface :

php bin/console make:user

Répondez aux questions pour définir les champs nécessaires (email, mot de passe, rôles...).


🚪 Étape 4 : Définir les routes de connexion et de déconnexion

Dans config/routes.yaml, ajoutez :

login:
    path: /login
    controller: App\Controller\SecurityController::login

logout:
    path: /logout

Puis, créez le contrôleur SecurityController avec les méthodes login() et éventuellement logout() si nécessaire.


✅ Étape 5 : Restreindre l’accès avec isGranted

Dans vos contrôleurs, utilisez l’attribut #[IsGranted] pour restreindre l’accès par rôle :

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Security\Http\Attribute\IsGranted;

class AdminController extends AbstractController
{
    #[IsGranted('ROLE_ADMIN')]
    public function dashboard(): Response
    {
        // Contenu réservé aux admins
    }
}

🧠 Étape 6 : Expressions complexes avec isGranted

Pour gérer des règles d’accès complexes :

use Symfony\Component\ExpressionLanguage\Expression;

#[IsGranted(new Expression('is_granted("ROLE_ADMIN") or user.isSuperAdmin()'))]
public function manage(): Response
{
    // Autorisé aux admins OU aux super-admins
}

👉 Pour plus d’informations : Symfony - Expressions de sécurité


🧪 Étape 7 : Tester les droits d’accès

Testez votre configuration :

  • Connectez-vous avec différents utilisateurs.
  • Essayez d’accéder à des routes restreintes.
  • Vérifiez que les restrictions fonctionnent bien selon les rôles.

✅ Conclusion

En appliquant ces étapes, vous sécurisez efficacement vos contrôleurs Symfony grâce au système isGranted, en profitant de la robustesse et de la souplesse du composant de sécurité Symfony.