Aller au contenu principal

Contrôle d'accès

Une fois qu'on est authentifié, une autre étape peut être présente : le contrôle d'accès.

Disons par exemple qu'on veuille générer un CRUD pour nos articles.

La commande make:crud nous génère la classe de contrôleurs et les vues pour gérer nos articles.

Mais par la suite, nous voulons restreindre l'accès à ce CRUD uniquement aux utilisateur administrateurs.

Première chose, dans la classe de contrôleurs, on peut utiliser l'attribut Route au niveau de la classe, afin de définir un préfixe d'URL :

#[Route("/admin/article")]
class ArticleController extends AbstractController
{
}

Tous les contrôleurs de cette classe répondront donc derrière une URL commençant par /admin/article.

Administrateur​

Par la suite, au niveau du fichier de configuration du composant de sécurité, on va activer le contrôle d'accès sur toutes les URL qui commencent par /admin :

config/packages/security.yaml

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

A présent, lorsqu'on voudra consulter une URL commençant par /admin, Symfony va effectuer les actions suivantes :

  • Vérifier à quel pare-feu correspond la requête. Ici, quelque chose qui correspond à /admin va correspondre à notre pare-feu main
  • Sur le pare-feu, nous n'avons précisé aucun "pattern" d'URL, contrairement au pare-feu dev, qui indique avec pattern: ^/(_(profiler|wdt)|css|images|js)/ qu'il correspond à toutes les URL commençant par "_profiler" ou "_wdt" ou encore "css", etc...donc par défaut nous n'aurions pas besoin de nous authentifier
  • Mais au niveau du contrôle d'accès, nous avons précisé que nous voulions restreindre tout ce qui commence par /admin au rôle ROLE_ADMIN
  • A ce moment-là, cela signifie qu'on a besoin d'avoir un utilisateur authentifié, afin de pouvoir vérifier son ou ses rôles
  • On active alors l'authenticator AppAuthenticator
  • Nous ne sommes pas connectés par défaut. Ainsi, une redirection est générée automatiquement vers la page de login associée à l'authenticator (voir la méthode getLoginUrl)
  • On s'authentifie avec le formulaire. Par la suite, si nos rôles sont corrects (si je possède le rôle "ROLE_ADMIN"), alors je peux accéder à mes pages d'administration

Utilisateurs connectés uniquement (peu importe le rôle)​

access_control:
- { path: ^/connected, roles: IS_AUTHENTICATED_FULLY }

N'importe quel utilisateur (accès public)​

access_control:
- { path: ^/public, roles: PUBLIC_ACCESS }