src/Controller/Backend/SecurityController.php line 61

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Backend;
  3. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  4. use Symfony\Component\HttpFoundation\Response;
  5. /**
  6. * ══════════════════════════════════════════════════════════════════════════
  7. * CONNEXION AU BACKOFFICE
  8. *
  9. * ══════════════════════════════════════════════════════════════════════
  10. * ⚠️ CE CONTRÔLEUR NE SUFFIT PAS À LUI SEUL
  11. * ══════════════════════════════════════════════════════════════════════
  12. *
  13. * Il affiche le formulaire. Le traitement du POST appartient à
  14. * `Security/LoginFormAuthenticator`, et celui-ci filtre sur le nom de
  15. * route :
  16. *
  17. * public function supports(Request $request): bool
  18. * {
  19. * $route = $request->attributes->get('_route');
  20. * return in_array($route, ['app_login', 'locale_app_login'], true)
  21. * && $request->isMethod('POST');
  22. * }
  23. *
  24. * Tant que `backend_login` n'est pas dans cette liste, le formulaire
  25. * postera dans le vide : Symfony ne trouvera aucun authenticator, et la
  26. * page se rechargera sans message d'erreur ni connexion.
  27. *
  28. * DEUX SOLUTIONS, au choix :
  29. *
  30. * 1. Ajouter `backend_login` au tableau de `supports()` — une ligne, et
  31. * le backoffice garde son écran de connexion propre. C'est ce que
  32. * décrit `patch/PATCH-backend.md`.
  33. *
  34. * 2. Ne pas utiliser cette route : pointer le firewall sur `app_login`
  35. * et supprimer ce contrôleur. Le backoffice partage alors l'écran de
  36. * connexion du site.
  37. *
  38. * La première est recommandée : elle sépare l'entrée administrateur de
  39. * l'entrée client, et permet un écran sans lien d'inscription.
  40. *
  41. * ── LE FORMULAIRE ──────────────────────────────────────────────────────
  42. *
  43. * Les champs attendus par l'authenticator sont `email`, `password` et
  44. * `_csrf_token`, avec le jeton `authenticate`. Le template les respecte.
  45. * ══════════════════════════════════════════════════════════════════════════
  46. */
  47. class SecurityController extends AbstractController
  48. {
  49. /**
  50. * GET /administration/login — le formulaire vit sur /admin/login.
  51. *
  52. * Le POST reste traité ici par `LoginFormAuthenticator` (route
  53. * `backend_login` dans `supports()`) : un formulaire encore ouvert qui
  54. * poste sur l'ancienne adresse se connecte quand même.
  55. */
  56. public function login(): Response
  57. {
  58. if ($this->isGranted('ROLE_ADMIN')) {
  59. return $this->redirectToRoute('admin_dashboard');
  60. }
  61. return $this->redirectToRoute('admin_login');
  62. }
  63. /**
  64. * GET /administration/logout
  65. *
  66. * ⚠️ CETTE MÉTHODE LEVAIT UNE EXCEPTION À CHAQUE APPEL.
  67. *
  68. * Le commentaire d'origine disait « interceptée par le firewall ».
  69. * Elle ne l'est pas : `security.yaml` déclare `logout: path: app_logout`
  70. * sur le pare-feu `main`, et UN PARE-FEU N'INTERCEPTE QU'UN SEUL
  71. * chemin de déconnexion. `/administration/logout` traversait donc
  72. * jusqu'ici, et renvoyait une 500.
  73. *
  74. * Ce n'était visible nulle part parce que la barre latérale pointe
  75. * déjà vers `app_logout` (voir sidebar.html.twig) — mais toute URL
  76. * tapée à la main, tout ancien signet, tombait dessus.
  77. *
  78. * La route est conservée : `path('backend_logout')` reste résolvable,
  79. * et elle mène maintenant là où elle prétendait mener.
  80. */
  81. public function logout(): Response
  82. {
  83. return $this->redirectToRoute('app_logout');
  84. }
  85. }