2012-01-29 22 views
21

Para el éxito de acceso hay un parámetro use_referer: true. Para la falla de inicio de sesión solo hay failure_path, que no es lo que estoy buscando.¿Cómo volver al referer después de la falla de inicio de sesión?

Segunda cosa: ¿Cómo hacer eso y pasar el mensaje de error?

Tercero: ¿Cómo regresar a la referencia después de la salida?

+0

¿por qué la ruta de falla no sería solo la solicitud de inicio de sesión? – JamesHalsall

+1

porque puedo iniciar sesión desde cada subpágina. No tengo un formulario de inicio de sesión en la URL especificada, por lo que no quiero redirigir al usuario a la página de inicio cuando inicia sesión, por ejemplo, en otra página de perfil de usuario. –

Respuesta

49

Lo resolví.

No es solución: How to disable redirection after login_check in Symfony 2

y aquí está el código que resuelve mi problema:

<?php 

namespace Acme\MainBundle\Handler; 

use Symfony\Component\Security\Http\Logout\LogoutSuccessHandlerInterface; 
use Symfony\Component\Security\Http\Authentication\AuthenticationFailureHandlerInterface; 
use Symfony\Component\Security\Core\Exception\AuthenticationException; 
use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\HttpFoundation\RedirectResponse; 

class AuthenticationHandler implements AuthenticationFailureHandlerInterface, LogoutSuccessHandlerInterface 
{ 
    public function onAuthenticationFailure(Request $request, AuthenticationException $exception) 
    {  
     $referer = $request->headers->get('referer');  
     $request->getSession()->setFlash('error', $exception->getMessage()); 

     return new RedirectResponse($referer); 
    } 

    public function onLogoutSuccess(Request $request) 
    { 
     $referer = $request->headers->get('referer'); 
     return new RedirectResponse($referer); 
    } 
} 

para controlar los eventos se suman a security.yml por ejemplo:

form_login: 
    check_path: /access/login_check 
    login_path:/
    use_referer: true 
    failure_handler: authentication_handler 
logout: 
    path: /access/logout 
    target:/
    success_handler: authentication_handler 

y en las configuraciones .yml:

services: 
    authentication_handler: 
     class: Acme\MainBundle\Handler\AuthenticationHandler 
+4

$ request-> headers-> get ('referer'); a veces devuelve nulo (me he reproducido en Firefox). Esta solución no es confiable, es necesario un respaldo u otra solución. – Julien

+0

@ wojciech-kulik Tengo el siguiente error: '' '$ request-> getSession() -> setFlash ('error', $ exception-> getMessage())' ' ' '' FatalErrorException: Error: Llamada al método indefinido Symfony \ Component \ HttpFoundation \ Session \ Session :: setFlash() en /var/www/symfony/src/Application/Sonata/UserBundle/Form/Handler/AuthenticationHandler.php línea 16''' – jcarlosweb

+0

@webyseo Probablemente tienes una versión diferente de Symphony y los mensajes flash se configuran de una manera diferente. Quizás ayude: http://stackoverflow.com/questions/13348534/symfony-2-setting-a-flash-message-outside-of-controller –

Cuestiones relacionadas