2012-06-24 13 views
23

È necessario eseguire una serie di azioni dopo che un utente ha effettuato correttamente l'accesso. Ciò include il caricamento dei dati dal database e l'archiviazione nella sessione.Symfony2: dopo aver eseguito correttamente l'evento di accesso, eseguire una serie di azioni

Qual è l'approccio migliore per l'implementazione di questo?

+1

Come fare uso di un Servizio: http://stackoverflow.com/questions/8308050/how-to-disable-redirection-after-login-check-in-symfony-2/8312188#8312188 – unairoldan

risposta

50

È possibile aggiungere un ascoltatore all'evento security.interactive_login.

collega il tuo listener in questo modo. In questo esempio passo anche il contesto di sicurezza e la sessione come dipendenze.

Nota: SecurityContext è deprecato come di Symfony 2.6. Si prega di fare riferimento alla http://symfony.com/blog/new-in-symfony-2-6-security-component-improvements

parameters: 
    # ... 

    account.security_listener.class: Company\AccountBundle\Listener\SecurityListener 

services: 
    # ... 

    account.security_listener: 
     class: %account.security_listener.class% 
     arguments: ['@security.context', '@session'] 
     tags: 
      - { name: kernel.event_listener, event: security.interactive_login, method: onSecurityInteractiveLogin } 

e nel vostro ascoltatore è possibile memorizzare tutto quello che volete sulla sessione. In questo caso ho impostato il fuso orario degli utenti.

<?php 

namespace Company\AccountBundle\Listener; 

use Symfony\Component\Security\Core\SecurityContextInterface; 
use Symfony\Component\HttpFoundation\Session\Session; 
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent; 

class SecurityListener 
{ 

    public function __construct(SecurityContextInterface $security, Session $session) 
    { 
     $this->security = $security; 
     $this->session = $session; 
    } 

    public function onSecurityInteractiveLogin(InteractiveLoginEvent $event) 
    { 
     $timezone = $this->security->getToken()->getUser()->getTimezone(); 
     if (empty($timezone)) { 
      $timezone = 'UTC'; 
     } 
     $this->session->set('timezone', $timezone); 
    } 

} 
+0

Questo sembra che farebbe il trucco. Ci sono delle dipendenze che devo dichiarare in classe? – jbsound

+0

No, solo le proprie dipendenze (gestore di entità probabilmente). – MDrollette

+0

Dopo aver scavato un po 'di più, sembra che ci siano delle dipendenze che devono essere specificate. Trovato questo articolo che mostra un'implementazione del codice più completa: http://www.metod.si/login-event-listener-in-symfony2/ – jbsound

6

È anche possibile recuperare l'istanza utente dall'evento stesso, senza necessità di iniettare l'archivio di token!

public function onSecurityInteractiveLogin(InteractiveLoginEvent $event) 
{ 
    $event->getAuthenticationToken()->getUser() 
} 
Problemi correlati