Cómo cambiar el comportamiento predeterminado de la ruta destino

By default, the security component retains the information of the last request URI in a session variable named _security.main.target_path (with main being the name of the firewall, defined in security.yml). Upon a successful login, the user is redirected to this path, as to help her continue from the last known page she visited.

En algunas ocasiones, esto es inesperado. Por ejemplo, cuando la URI de la última petición HTTP POST contra una ruta que está configurada para permitir sólo un método POST, el usuario es redirigido a esta ruta sólo para obtener un error 404.

Para evitar este comportamiento, sólo tendrías que extender la clse ExceptionListener y anular el método llamado setTargetPath().

En primer lugar, redefine el parámetro security.exception_listener.class en el archivo de configuración. Lo puedes hacer en tu archivo de configuración (en app/config) o en un archivo de configuración importado desde un paquete:

  • YAML
    # src/Acme/HelloBundle/Resources/config/services.yml
    parameters:
        # ...
        security.exception_listener.class: Acme\HelloBundle\Security\Firewall\ExceptionListener
    
  • XML
    <!-- src/Acme/HelloBundle/Resources/config/services.xml -->
    <parameters>
        <!-- ... -->
        <parameter key="security.exception_listener.class">Acme\HelloBundle\Security\Firewall\ExceptionListener</parameter>
    </parameters>
    
  • PHP
    // src/Acme/HelloBundle/Resources/config/services.php
    // ...
    $container->setParameter('security.exception_listener.class', 'Acme\HelloBundle\Security\Firewall\ExceptionListener');
    

A continuación, crea tu propio escucha ExceptionListener:

// src/Acme/HelloBundle/Security/Firewall/ExceptionListener.php
namespace Acme\HelloBundle\Security\Firewall;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Http\Firewall\ExceptionListener as BaseExceptionListener;

class ExceptionListener extends BaseExceptionListener
{
    protected function setTargetPath(Request $request)
    {
        // no guarda la ruta destino de peticiones XHR y distintas de GET
        // Puedes añadir cualquier lógica que quieras
        if ($request->isXmlHttpRequest() || 'GET' !== $request->getMethod()) {
            return;
        }

        $request->getSession()->set('_security.main.target_path', $request->getUri());
    }
}

¡Aquí añade tanta lógica como requieras para tu escenario!

Bifúrcame en GitHub