2
votes

Comment rediriger vers une URL externe dans la déconnexion de Symfony 4

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


0 commentaires

3 Réponses :


2
votes

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.


2 commentaires

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.



0
votes

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);
    }
}


1 commentaires

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?



1
votes

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);
    }
}


0 commentaires