2012-08-28 7 views
5

Ho un'applicazione in cui ho un ruolo superadmin e vari ruoli utente con diversi privilegi. Voglio essere in grado di impersonare come qualcuno di questi utenti utilizzando la query _switch_user come mostrato su http://symfony.com/doc/current/book/security.html#impersonating-a-userIn che modo symfony ascolta l'utente _switch?

Tuttavia, quando aggiungo la query alla fine del mio url, non sembra fare nulla. Ho giocato a lungo con questo per molto tempo e non riesco a trovare una soluzione. So che l'utente che ho effettuato l'accesso ha lo ROLE_ALLOWED_TO_SWITCH, ma non riesco a capire come funziona symfony.

Sto utilizzando un provider di autenticazione personalizzato, quindi penso che abbia qualcosa a che fare con questo, ma non sono sicuro di cosa ho bisogno di guardare. Posso pubblicare qualsiasi codice necessario, ma non sono sicuro di cosa pubblicare in questo momento.

risposta

4

Quindi ho scavato un po 'di più e ho scoperto che la classe Listener per il mio provider di autenticazione personalizzato non era stata scritta correttamente. È stato scritto in modo tale che un nuovo Token è stato creato su ogni caricamento della pagina.

Come risultato sono state necessarie due cose.

Il primo era modificare il listener di autenticazione in modo che fosse simile a quello nello Symfony Firewall Listeners, la cui struttura generale è illustrata di seguito.

if (null !== $token = $this->securityContext->getToken()) { 
    if ($token instanceof UsernamePasswordToken && $token->isAuthenticated() && 
     $token->getUsername() === $username) { 
      return; 
    } 
} 

Questi ascoltatori consentono fondamentalmente all'autenticazione di procedere senza creare un nuovo token se si verificano determinate condizioni. Queste condizioni sono che il token è un'istanza del token di destra, è autenticato e il nome utente corrisponde a quello dell'utente loggato.

In secondo luogo, questo codice ha dovuto essere modificato per verificare l'autenticazione basata sull'utente originale se ha provato a cambiare utente. This issue descrive un problema simile a qualcun altro. La soluzione era quella di scorrere i ruoli per trovare uno SwitchUserRole e utilizzare tali dati per l'autenticazione. Ho copiato la patch qui sotto, che andrebbe dopo l'iniziale dichiarazione if sopra.

foreach ($token->getRoles() as $role) { 
    if ($role instanceof SwitchUserRole) { 
     $token = $role->getSource(); 
      break; 
    } 
} 

Insieme, l'ascoltatore di autenticazione sarà solo creare un nuovo token, se non passa determinate condizioni e un utente che sta impersonando un altro avranno le loro credenziali utilizzato per l'autenticazione test invece di quella dell'utente che sono cercando di impersonare.