src/Controller/Backend/SecurityController.php line 63

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