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 à
/adminva correspondre à notre pare-feumain - Sur le pare-feu, nous n'avons précisé aucun "pattern" d'URL, contrairement au pare-feu
dev, qui indique avecpattern: ^/(_(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
/adminau rôleROLE_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 }