2012-06-24 4 views

Antwort

50

Sie können dem Ereignis security.interactive_login einen Listener hinzufügen.

befestigen Sie Ihren Hörer wie so. In diesem Beispiel gebe ich auch den Sicherheitskontext und die Sitzung als Abhängigkeiten weiter.

Hinweis: Security als von Symfony 2.6 veraltet. Bitte beachten Sie 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 } 

und in Ihrem Hörer können Sie speichern, was Sie auf der Sitzung wollen. In diesem Fall stelle ich die Zeitzone des Benutzers ein.

<?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

Das sieht so aus, als ob es den Trick machen würde. Gibt es Abhängigkeiten, die ich in der Klasse deklarieren muss? – jbsound

+0

Nein, nur Ihre eigenen Abhängigkeiten (Entity Manager wahrscheinlich). – MDrollette

+0

Nach dem Graben ein bisschen mehr, scheint es, dass gibt es Abhängigkeiten, die angegeben werden müssen. Gefunden diesen Artikel, der eine vollständigere Code-Implementierung zeigt: http://www.metod.si/login-event-listener-in-symfony2/ – jbsound

6

Sie können sogar die Benutzerinstanz aus dem Ereignis selbst holen, keine Notwendigkeit, die Token-Speicher zu spritzen!

public function onSecurityInteractiveLogin(InteractiveLoginEvent $event) 
{ 
    $event->getAuthenticationToken()->getUser() 
} 
Verwandte Themen