2013-04-18 18 views
17

Dire il mio percorso /booking/(.*) è protetta da una configurazione firewall in security.yml e richiede "ROLE_USER", quando l'utente tenta di accedere qualsiasi percorso preceduto da "/booking/" l'app reindirizza l'utente alla pagina di accesso per l'autenticazione.Come funziona Symfony2 reindirizzamento alla pagina richiesta dopo il login

Quindi la mia domanda è, dopo che l'utente fornisce le sue credenziali e viene autenticato, come è Symfony 2 in grado di reindirizzare l'utente alla pagina/percorso che l'utente aveva richiesto a favore o da dove viene Symfony 2 negozio che percorso fa memorizzalo in qualche sessione o qualcos'altro.

Possiamo accedervi e come?

risposta

24

Questo è possibile e si può accedere al link di riferimento (che viene utilizzato se use_referer è impostato su true) nella sessione.

Per esempio, se si dispone di un servizio di success_handler sul form_login (nella configurazione del firewall) che reindirizza gli utenti sulla base di alcuni criteri (comunemente ruoli), ma si voleva per reindirizzare l'utente al link referrer se è stato impostato si potrebbe vedere il link referrer in questo modo:

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

Utilizzando l'intestazione per ottenere il referrer (ovvero $request->headers->get('referer')) non funziona in questo caso perché sarà sempre tornare il link di accesso.

Grazie alla romana Marintsenko & Ryan Weaver per la soluzione di questo blog

+0

Hai qualche consiglio per questo caso? Qui, abbiamo bisogno del referrer del referrer ... –

+0

@aminejallouli probabilmente starai meglio a conservare quell'informazione da qualche parte (ad esempio la sessione) e ad accedervi quando ne hai bisogno. –

+0

Ecco come ho fatto! Funziona ora! :) Grazie –

3

Symfony utilizza il HTTP Referer header per reindirizzare un utente torna alla pagina di provenienza .. cioè il referrer

È possibile impostare questo utilizzando la configurazione di sicurezza use_referer: true nel security.yml, details here

È possibile accedere alla un'intestazione referer da un controller utilizzando utilizzando il seguente:

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

Nota l'intestazione è miss-farro, la sua referer (una R)

+1

Grazie per la risposta, ma ciò di cui ho bisogno è un po 'diverso. Dopo una piccola ricerca ho trovato la risposta alla mia domanda http://knplabs.com/blog/redirect-after-registration-in-symfony2 – Arif

10

Carrie Kendall ha lavorato, grazie!

Ecco piena attuazione in Symfony:

services.yml:

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

e in Project \ BaseBundle \ Service \ loginHandler:

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

    } 
} 
4

ho avuto anche questo problema. Ho usato security.yml e nell'azione di registrazione utilizzata:

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

enjoy.

Problemi correlati