<?phpnamespace App\Controller\Backend;use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;use Symfony\Component\HttpFoundation\Response;use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;/** * ══════════════════════════════════════════════════════════════════════════ * CONNEXION AU BACKOFFICE * * ══════════════════════════════════════════════════════════════════════ * ⚠️ CE CONTRÔLEUR NE SUFFIT PAS À LUI SEUL * ══════════════════════════════════════════════════════════════════════ * * Il affiche le formulaire. Le traitement du POST appartient à * `Security/LoginFormAuthenticator`, et celui-ci filtre sur le nom de * route : * * public function supports(Request $request): bool * { * $route = $request->attributes->get('_route'); * return in_array($route, ['app_login', 'locale_app_login'], true) * && $request->isMethod('POST'); * } * * Tant que `backend_login` n'est pas dans cette liste, le formulaire * postera dans le vide : Symfony ne trouvera aucun authenticator, et la * page se rechargera sans message d'erreur ni connexion. * * DEUX SOLUTIONS, au choix : * * 1. Ajouter `backend_login` au tableau de `supports()` — une ligne, et * le backoffice garde son écran de connexion propre. C'est ce que * décrit `patch/PATCH-backend.md`. * * 2. Ne pas utiliser cette route : pointer le firewall sur `app_login` * et supprimer ce contrôleur. Le backoffice partage alors l'écran de * connexion du site. * * La première est recommandée : elle sépare l'entrée administrateur de * l'entrée client, et permet un écran sans lien d'inscription. * * ── LE FORMULAIRE ────────────────────────────────────────────────────── * * Les champs attendus par l'authenticator sont `email`, `password` et * `_csrf_token`, avec le jeton `authenticate`. Le template les respecte. * ══════════════════════════════════════════════════════════════════════════ */class SecurityController extends AbstractController{ /** * GET /administration/login */ public function login(AuthenticationUtils $authenticationUtils): Response { /* Déjà connecté et administrateur : inutile de redemander. */ if ($this->isGranted('ROLE_ADMIN')) { return $this->redirectToRoute('backend_dashboard'); } return $this->render('backend/login.html.twig', [ 'derniereErreur' => $authenticationUtils->getLastAuthenticationError(), 'dernierEmail' => $authenticationUtils->getLastUsername(), ]); } /** * GET /administration/logout * * ⚠️ CETTE MÉTHODE LEVAIT UNE EXCEPTION À CHAQUE APPEL. * * Le commentaire d'origine disait « interceptée par le firewall ». * Elle ne l'est pas : `security.yaml` déclare `logout: path: app_logout` * sur le pare-feu `main`, et UN PARE-FEU N'INTERCEPTE QU'UN SEUL * chemin de déconnexion. `/administration/logout` traversait donc * jusqu'ici, et renvoyait une 500. * * Ce n'était visible nulle part parce que la barre latérale pointe * déjà vers `app_logout` (voir sidebar.html.twig) — mais toute URL * tapée à la main, tout ancien signet, tombait dessus. * * La route est conservée : `path('backend_logout')` reste résolvable, * et elle mène maintenant là où elle prétendait mener. */ public function logout(): Response { return $this->redirectToRoute('app_logout'); }}