Creative Commons License
This work is licensed under a
Creative Commons
Attribution-Share Alike 3.0
Unported License.

Master Symfony2 fundamentals

Be trained by SensioLabs experts (2 to 6 day sessions -- French or English).
trainings.sensiolabs.com

Symfony hosting done right

ServerGrove, outstanding support at the right price for your Symfony hosting needs.
servergrove.com

Discover the SensioLabs Support

Access to the SensioLabs Competency Center for an exclusive and tailor-made support on Symfony
sensiolabs.com

Come cambiare il comportamento del percorso di rinvio predefinito

Come cambiare il comportamento del percorso di rinvio predefinito

Per impostazione predefinita, il componente della sicurezza mantiene l'informazione sull'URI dell'ultima richiesta in una variabile di sessione chiamata _security.target_path. Dopo un login eseguito con successo, l'utente viene rinviato a tale percorso, per aiutarlo a continuare dalla sua ultima pagina vista.

In alcune occasioni, tale comportamento è inatteso. Per sempio, quando l'URI dell'ultima richiesta era un POST HTTP su una rotta configurata per consentire solo il metodo POST, l'utente viene rinviato a tale rotta per ottenere un errore 404.

Per ovviare a questo problema, basta estendere la classe ExceptionListener e sovrascrivere il metodo chiamato setTargetPath().

Sovrascrivere prima il parametro security.exception_listener.class nel file di configurazione. Lo si può fare nel file di configurazione principale (in app/config) o nel file di configurazione di un bundle:

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

Creare quindi il proprio ExceptionListener:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
// 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)
    {
        // Non salavre il percorso per richieste XHR e non GET
        // Si può aggiungere altra logica a piacere
        if ($request->isXmlHttpRequest() || 'GET' !== $request->getMethod()) {
            return;
        }

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

Aggiungere pure altra logica, se necessaria!