2012-06-24 8 views
23

उपयोगकर्ता को सफलतापूर्वक लॉग इन करने के बाद मुझे क्रियाओं का एक सेट करने की आवश्यकता है। इसमें डेटाबेस से डेटा लोड करना और सत्र में संग्रहीत करना शामिल है।Symfony2: सफल लॉगिन ईवेंट के बाद, क्रियाओं का सेट

इसे लागू करने का सबसे अच्छा तरीका क्या है?

+1

एक सेवा का उपयोग कर यह करने के लिए कैसे: http://stackoverflow.com/questions/8308050/how-to-disable-redirection-after-login-check-in-symfony-2/8312188#8312188 – unairoldan

उत्तर

50

आप security.interactive_login ईवेंट में श्रोता जोड़ सकते हैं।

इस तरह अपने श्रोता को संलग्न करें। इस उदाहरण में मैं सुरक्षा संदर्भ और सत्र को निर्भरता के रूप में भी पास करता हूं।

नोट: SecurityContext Symfony 2.6 के रूप में मान्य नहीं है। 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 } 

देखें और अपने श्रोता में आप स्टोर कर सकते हैं जो कुछ भी आप सत्र पर चाहते हैं। इस मामले में मैंने उपयोगकर्ताओं को टाइमज़ोन सेट किया है।

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

ऐसा लगता है कि यह चाल करेगा। क्या कक्षा में घोषित करने की मुझे कोई निर्भरता है? – jbsound

+0

नहीं, केवल आपकी अपनी निर्भरताएं (इकाई प्रबंधक शायद)। – MDrollette

+0

थोड़ा और खोदने के बाद, ऐसा लगता है कि ऐसी निर्भरताएं हैं जिन्हें निर्दिष्ट करने की आवश्यकता है। इस आलेख को मिला जो एक पूर्ण कोड कार्यान्वयन दिखाता है: http://www.metod.si/login-event-listener-in-symfony2/ – jbsound

6

तुम भी घटना से ही उपयोगकर्ता उदाहरण प्राप्त कर सके, टोकन भंडारण इंजेक्षन करने की कोई जरूरत!

public function onSecurityInteractiveLogin(InteractiveLoginEvent $event) 
{ 
    $event->getAuthenticationToken()->getUser() 
} 
संबंधित मुद्दे