Je me demande simplement s'il existe une solution simple à cela dans Symfony 4. Normalement, les utilisateurs se déconnectent et sont renvoyés à la page d'accueil. Mais il y a une page où il est vérifié que l'utilisateur est actuellement authentifié sur un autre site, si cela est incorrect, j'ai un lien qui déconnecte l'utilisateur de mon site et redirige vers le site externe. J'ai géré cela sur une ancienne version du site basée sur silex en utilisant le routage suivant des contrôleurs dans app.php
$app->get('/logout', $app->factory(function() use($app) { $pid = $app['request_stack']->getCurrentRequest()->query->get('pid'); $message = $app['request_stack']->getCurrentRequest()->query->get('message'); $redirect = $app['request_stack']->getCurrentRequest()->query->get('redirect'); return $app->redirect(FRAMEWORK_URL."/logout?pid=$pid&message=$message&redirect=$redirect"); })
);
Merci
Martyn
3 Réponses :
Définissez la valeur de logout.target
pour un pare-feu dans security.yaml
sur une URL externe:
firewalls: main: ... logout: ... target: 'EXTERNAL URL'
Valeur de logout.target
peut être une URL ou un nom de route d'application. La route de l'application et le contrôleur associé peuvent être utilisés pour créer des cibles de redirection dynamique.
Salut Andreas, pourriez-vous me donner un peu plus d'aide s'il vous plaît? Je n'arrive pas à le faire fonctionner (voir ci-dessous). Si je crée un lien vers «redirectafterlogout» avec une URL attachée, cela ne me déconnecte pas?
target
ne peut être défini que sur le même domaine, donc cela ne fonctionnera pas. Regardez Symfony \ Component \ Security \ Http \ HttpUtils :: createRedirectRes ponse
. Il y a un contrôle ! Preg_match (sprintf ($ this-> domainRegexp, preg_quote ($ request-> getHttpHost ())), $ host [0])
qui s'assure que le domaine à rediriger est le même comme domaine de la requête.
Ok alors j'ai essayé ceci
J'ai créé une nouvelle route dans un contrôleur:
logout: path: logout target: 'redirectafterlogout'
J'ai ajouté ceci à security.yaml
/** * @Route("/redirectafterlogout/{url?/}", name="redirectafterlogout") */ public function redirectafterlogout($url) { if($url == "/"){ // redirects to the "homepage" route return $this->redirectToRoute('homepage'); } else { return $this->redirect('http://'.$url); } }
Peut-être que votre navigateur vous montre simplement une page mise en cache (dans un état connecté). Pouvez-vous accéder à des itinéraires restreints après la redirection?
Malheureusement, logout.target
ne fonctionnera pas car il y a une vérification spéciale (dans Symfony \ Component \ Security \ Http \ HttpUtils :: createRedirectResponse
) pour faire correspondre le domaine de requête à le domaine de redirection. S'ils ne sont pas identiques, la cible sera définie sur /
.
La bonne façon de rediriger vers une URL externe est de créer une classe qui implémente Symfony \ Component \ Security \ Http \ Logout \ LogoutSuccessHandlerInterface
, par exemple comme ceci:
security: firewalls: main: logout: success_handler: 'App\Security\CustomLogoutSuccessHandler'
Ensuite, créez le service dans services.yaml
:
services: App\Security\CustomLogoutSuccessHandler: arguments: ['%env(resolve:LOGOUT_TARGET_URL)%'] # resolve from .env (or you can get from anywhere)
et enfin dites à security.yaml
d'utiliser votre gestionnaire au lieu de celui par défaut:
<?php // src/Security/CustomLogoutSuccessHandler.php class CustomLogoutSuccessHandler implements LogoutSuccessHandlerInterface { private $target; public function __construct(string $target) { $this->target = $target; } public function onLogoutSuccess(Request $request) { return new RedirectResponse($this->target); } }