[Symfony] Création d’un espace sécurisé

Lorsque j’ai appris à développer sous Symfony, il y a un point qui m’a fait tout de suite extrêmement peur, de par sa complexité au premier abord, c’est la gestion de la connexion des utilisateurs. Mais, avec un peu d’entraînement, tout devient extrêmement simple à mettre en place.

Aujourd’hui, nous allons aborder le sujet en créant un simple espace sécurisé pour un administrateur unique.

Préparez vos Controllers

La première étape consiste à préparer vos controllers, pour ça, nous allons partir du principe que nous utilisons le controller DefaultController et allons créer le controller AdminController qui sera réservé à l’administrateur connecté. Nous allons ainsi devoir créer plusieurs routes :

  • DefaultController :
    • Login : Afficher le moteur de recherche
  • AdminController :
    • Index : Afficher l’interface d’administration
    • LoginCheck : Vérifier les informations à la connexion
    • Logout : Se déconnecter

Les méthodes AdminController::LoginCheckAction et AdminController::LogoutAction sont un peu particulières. En effet, elles resteront vides, c’est symfony qui gère entièrement leur comportement. Il faut simplement préciser quel URI utiliser.

La méthode DefaultController::loginAction fait appel au service security.authentication_utils qui permet de récupérer automatiquement deux méthodes :

  • security.authentication_utils::getLastUsername : Dernier nom d’utilisateur ayant tenté de se connecter.
  • security.authentication_utils::getLastAuthenticationError : Dernières erreurs éventuelles générée par une tentative de connexion.

Deux méthodes dont nous récupérons les résultats que nous envoyons alors vers twig.

Formulaire de connexion

Contrairement aux habitudes de Symfony, nous allons créer le formulaire de connexion à la main. Pour se faire, nous allons créer le app/Ressources/views/default/login.html.twig :

Ici, nous faisons commençons, ligne 5, par afficher les erreurs éventuelles. Puis nous créons notre formulaire :

  • L’input Text pour le nom d’utilisateur doit forcément avoir le nom _username pour que Symfony puisse le traiter automatiquement dans la route login_check, nous y mettons par défaut la valeur correspond au dernier nom d’utilisateur renseigné.
  • L’Input Password doit également avoir comme nom _password.

Nous envoyons alors ce formulaire vers la route correspondant à la méthode AdminController::LoginCheckAction() grâce à <form action="{{ path('login_check') }}">.

Maintenant, il faut activer l’espace utilisateur sur Symfony.

Configuration de Symfony

Nous pouvons maintenant configurer le fichier app/config/security.yml pour donner à Symfony toute la logique de l’espace sécurisé. Il faut avoir conscience que Symfony est très puissant de ce côté là et peut aller très loin, en combinant les types d’utilisateurs, les méthodes de connexion, les algorithme de chiffrement de mot de passe, etc. Ici, nous allons faire au plus simple :

Que faut-il comprendre ici :

  • security.encoders : Liste des méthodes de chiffrement du mot de passe en fonction des objets utilisés. Ici, nous utiliserons l’objet par défaut de Symfony Symfony\Component\Security\Core\User\User et nous stockerons le mot de passe en clair (plaintext). Il est possible d’aller bien plus loin, en créant sa propre entité utilisateur (pour les stocker en base de donnée) et en chiffrant les mots de passe avec bcrypt par exemple.
  • providers : Ici, on liste les différentes méthodes d’authentification à activer sur Symfony. Nous en utiliseront qu’une seule : in_memory, qui permet de stocker en dur, dans le fichier security.yml, la liste des utilisateurs pouvant se connecter.
  • providers.in_memory.memory.users : Liste des utilisateurs.
  • providers.in_memory.memory.users.admin : Nouvel utilisateur « admin ».
  • providers.in_memory.memory.users.admin.password : Mot de passe en clair.
  • providers.in_memory.memory.users.admin.roles : Droits d’accès de l’utilisateur.
  • firewalls : Liste des environnements à sécuriser.
  • firewalls.dev : Environnement par défaut, utilisé pour gérer votre app_dev.php
  • firewalls.admin : Notre nouvel environnement.
  • firewalls.admin.provider : On sélectionne le provider que l’on souhaite attribuer à notre environnement, ici in_memory.
  • firewalls.admin.pattern: On active cet environnement uniquement lorsque la route correspond au chemin renseigné, ici, toutes les URL qui commencent par /admin.
  • firewalls.admin.form_login : On gère ici la logique de notre formulaire de connexion.
  • firewalls.admin.form_login.login_path: C’est le nom de la route qui contient notre formulaire de connexion, chez nous, login.
  • firewalls.admin.form_login.check_path : C’est le nom de la route vers laquelle on redirige notre formulaire, chez nous, login_check.
  • firewalls.admin.form_login.default_target_path : C’est le nom de la route vers laquelle on redirige l’utilisateur une fois connecté, chez nous, admin.
  • firewalls.admin.logout : C’est la logique de déconnexion d’un utilisateur.
  • firewalls.admin.logout.path : Le nom de la route sur laquelle on déconnecte l’utilisateur, chez nous, logout.
  • firewalls.admin.logout.target : Le nom de la route vers laquelle on redirige un utilisateur une fois déconnecté, chez nous, homepage.
  • access_control : On gère ici les limitations d’accès en fonction des rôles utilisateurs.
  • access_control.admin : On créé une règle d’accès pour l’administration.
  • access_control.admin.path : On active la règle d’accès pour toutes les URI commençant par /admin.
  • access_control.admin.roles : On authorise l’accès qu’aux utilisateurs connectés ayant le droit d’accès ROLE_ADMIN.

Conclusion

Et c’est tout ! Oui … C’est tout. Symfony s’occupe de tout le reste. Maintenant, depuis votre site internet, vous pourrez tenter d’accéder à /admin, si vous n’êtes pas connecté, vous serez redirigé automatiquement vers /login. Il vous faudra alors renseigner le nom d’utilisateur admin puis le mot de passe PASSWORD123 pour être redirigé vers /admin et ainsi avoir accès à toutes vos routes commençant par /admin. Votre administration est maintenant sécurisée.

La prochaine étape ? Gérer une base de donnée d’utilisateurs, ayant des droits d’administration ou non. A bientôt !

Laisser un commentaire