Comment symfony2 rediriger à la page demandée après la connexion

Dire que mon itinéraire /réservation/(.*) est protégé par une configuration pare-feu dans sécurité.yml et il exige " ROLE_USER", lorsque l'utilisateur tente d'accéder à n'importe quel itinéraire est précédée par "/réservation/" l'application redirige l'utilisateur vers la page de connexion pour l'authentification.

donc ma question Est, après que l'utilisateur ait fourni ses justificatifs d'identité et soit authentifié, comment Symfony 2 peut-il rediriger l'utilisateur vers la page / la route que l'utilisateur avait demandé pour ou Où est Symfony 2 stocker que route est-ce qu'il le stocke dans une session ou ailleurs.

Peut-on y accéder et comment?

18
demandé sur Carrie Kendall 2013-04-18 13:44:56

4 réponses

C'est possible et vous pouvez accéder au lien de référence (qui est utilisé si use_referer est réglé sur true) dans la session.

Par exemple, si vous avez un success_handler service form_login (dans votre configuration pare-feu) qui redirige les utilisateurs en fonction de certains critères (rôles courants) mais vous vouliez rediriger l'utilisateur vers le lien de referrer si il a été mis en vous pouvez accéder au lien de référence comme suit:

$key = '_security.main.target_path'; #where "main" is your firewall name

//check if the referrer session key has been set 
if ($this->container->get('session')->has($key)) {
    //set the url based on the link they were trying to access before being authenticated
    $url = $this->container->get('session')->get($key);

    //remove the session key
    $this->container->get('session')->remove($key);
}
//if the referrer key was never set, redirect to a default route
else{
    $url = $this->router->generate('member_home');
}

return new RedirectResponse($url); 

utiliser l'en-tête pour obtenir le referrer (ie $request->headers->get('referer')) ne fonctionnera pas dans ce cas car il retournera toujours le lien de connexion.

merci à Roman Marintsenko & Ryan Weaver pour cela blog

26
répondu Carrie Kendall 2016-11-17 14:57:51

la solution de Carrie Kendall a fonctionné, merci!

services.yml:

login_handler:
    class: Project\BaseBundle\Service\loginHandler
    arguments: ['@router', '@doctrine.orm.entity_manager', '@service_container']
namespace Project\BaseBundle\Service;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface;
use Symfony\Component\Routing\RouterInterface;
use Doctrine\ORM\EntityManager;


class loginHandler implements AuthenticationSuccessHandlerInterface {

    private $router;
    private $container;
    private static $key;

    public function __construct(RouterInterface $router, EntityManager $em, $container) {

        self::$key = '_security.secured_area.target_path';

        $this->router = $router;
        $this->em = $em;
        $this->session = $container->get('session');

    }

    public function onAuthenticationSuccess( Request $request, TokenInterface $token ) {

        $user_entity = $token->getUser();

        if( !$user_entity->getChangePassword() ) {

            $route = $this->router->generate('BaseBundle_home_page');

        } else {

            $this->session->getFlashBag()->add('error', 'Your password must be changed now');

            $route = $this->router->generate('BaseBundle_account_page');

        }

        //check if the referer session key has been set
        if ($this->session->has( self::$key )) {

            //set the url based on the link they were trying to access before being authenticated
            $route = $this->session->get( self::$key );

            //remove the session key
            $this->session->remove( self::$key );
            //if the referer key was never set, redirect to a default route

        } else{

            $url = $this->generateUrl('BaseBundle_home_page');

            return new RedirectResponse($route);

        }

        return new RedirectResponse($route);

    }
}
10
répondu David Lefkon 2015-07-02 13:16:16

j'ai eu ce problème aussi. J'ai utilisé de la sécurité.yml et dans l'inscription de l'action:

$redirectUrl = $request->getSession()->get('_security.account.target_path');

profiter.

4
répondu Dmitry Davydov 2014-03-19 16:53:31

Symfony utilise le en-tête HTTP Referer pour rediriger un utilisateur vers la page, ils sont venus .. c'est à dire le référent

vous pouvez définir cela en utilisant la configuration de sécurité use_referer: true dans la sécurité.yml,plus de détails ici

vous pouvez accéder à l'en-tête referer à partir d'un contrôleur en utilisant ce qui suit :

$referer = $request->headers->get('referer');

Remarque: l'en-tête est miss-spelt, son referer (one r)

3
répondu ManseUK 2013-04-18 10:24:34