instalar - symfony español
¿Cómo redirecciona symfony2 a la página solicitada después de iniciar sesión? (4)
La solución de Carrie Kendall funcionó, gracias!
Aquí está la implementación completa en Symfony:
services.yml:
login_handler:
class: Project/BaseBundle/Service/loginHandler
arguments: [''@router'', ''@doctrine.orm.entity_manager'', ''@service_container'']
y en 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);
}
}
Digamos que mi ruta /booking/(.*) está protegida por una configuración de firewall en security.yml y requiere " ROLE_USER ", cuando el usuario intenta acceder a cualquier ruta que esté precedida por " / booking / " la aplicación redirige al usuario para que inicie sesión Página de autenticación.
Entonces, mi pregunta es: después de que el usuario proporciona sus credenciales y se autentica, ¿cómo puede Symfony 2 redirigir al usuario a la página / ruta que el usuario había solicitado O, donde Symfony 2 almacena esa ruta , la almacena en alguna sesión o en algún otro lugar.
¿Podemos acceder y cómo?
Symfony usa el encabezado HTTP Referer para redirigir a un usuario de nuevo a la página de la que vino ... es decir, la referencia
Puede configurarlo usando la configuración de seguridad use_referer: true
en security.yml, detalles aquí
Puede acceder al encabezado de referencia desde un controlador usando lo siguiente:
$referer = $request->headers->get(''referer'');
Tenga en cuenta que el encabezado está mal escrito, su referente (una r)
Yo tuve este problema también. Utilicé security.yml y en la acción de registro utilizada:
$redirectUrl = $request->getSession()->get(''_security.account.target_path'');
disfrutar.
Esto es posible y puede acceder al enlace de referencia (que se usa si use_referer
se establece en true
) en la sesión.
Por ejemplo, si tiene un servicio success_handler
en su form_login
(en su configuración de firewall) que redirige a los usuarios según algunos criterios (generalmente roles) pero desea redirigir al usuario al enlace de referencia, si se configuró , podría acceder al enlace de referencia al igual que:
$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);
El uso del encabezado para obtener el remitente (es decir, $request->headers->get(''referer'')
) no funcionará en este caso porque siempre devolverá el enlace de inicio de sesión.
Gracias a Roman Marintsenko y Ryan Weaver por este blog