2012-06-06 10 views
5

क्या कोई ऐसा तरीका है जिसे मैं आखिरी बार लॉग इन करता हूं जब उपयोगकर्ता लॉग इन करता था?Symfony2 लॉगिन और सुरक्षा

मैं symfony2 का उपयोग कर रहा हूं, और सबकुछ सुरक्षा कॉन्फ़िगरेशन के साथ ठीक से काम कर रहा है।

मैंने यह Security and login on a Symfony 2 based project देखा है, जो एक समान प्रश्न है, लेकिन यह मेरी आवश्यकताओं के अनुरूप नहीं है।

क्या कोई अन्य समाधान है?

+0

क्या आप हमें बता सकते हैं कि यह आपकी आवश्यकताओं के अनुरूप क्यों नहीं था? आपको और क्या करना होगा? सेवाएं निश्चित रूप से इस तरह के लिए मेरी पसंद होगी ... –

उत्तर

15

आप AuthenticationHandler बना सकते हैं कि उपयोगकर्ता लॉगिन सफलतापूर्वक कॉल करते समय सिम्फनी कॉल करेगा, आप लॉगिन समय को User इकाई संपत्ति में सहेज सकते हैं (मान लीजिए कि आपके पास यह परिदृश्य है)।

पहले, सफलता प्रमाणीकरण हैंडलर बनाने के लिए:

namespace Acme\TestBundle\Handler; 

use Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface; 
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; 
use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\HttpFoundation\RedirectResponse; 
use Symfony\Component\DependencyInjection\ContainerAware; 

class AuthenticationHandler extends ContainerAware implements AuthenticationSuccessHandlerInterface 
{ 
    function onAuthenticationSuccess(Request $request, TokenInterface $token) 
    { 
     $token->getUser()->setLoginTime(new \DateTime()); 
     $this->container->get('doctrine')->getEntityManager()->flush(); 

     return new RedirectResponse($this->container->get('router')->generate('login_success')); 
    } 
} 

तो फिर तुम एक विन्यास फाइल में एक सेवा के रूप प्रमाणीकरण हैंडलर रजिस्टर करने के लिए, उदाहरण के लिए की जरूरत है, src/Acme/TestBundle/resources/Config/services.yml

services: 
    authentication_handler: 
     class: Acme\TestBundle\Handler\AuthenticationHandler 
     calls: 
      - [ setContainer, [ @service_container ] ] 

और लॉगिन कॉन्फ़िगर बनाए गए हैंडलर का उपयोग करने के लिए फॉर्म, अपना security.yml

form_login: 
    success_handler: authentication_handler 
देखें

जाहिर है, इसके लिए काम करने के लिए, आपको User इकाई loginTime संपत्ति और संबंधित सेटर के साथ होना चाहिए। और आपको उपयोगकर्ता प्रदाता और DaoAuthenticationProvider के रूप में User इकाई भंडार का उपयोग करने के लिए लॉगिन कॉन्फ़िगर करने की आवश्यकता है, जैसा कि यहां बताया गया है: http://symfony.com/doc/current/book/security.html#loading-users-from-the-database

+0

आपने फ्लश() ' –

+1

एमएमएमएम से पहले हैंडलर में 'persist()' कॉल को याद किया ... मुझे नहीं लगता कि 'persist()' आवश्यक है चूंकि 'उपयोगकर्ता' ऑब्जेक्ट के माध्यम से प्राप्त 'उपयोगकर्ता' ऑब्जेक्ट पहले से ही सिद्धांत इकाई प्रबंधक द्वारा प्रबंधित किया जाता है। यह http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/unitofwork.html#how-doctrine-keeps-track-of-objects देखें। – eagleoneraptor

+0

आपके उदाहरण में आप उपयोगकर्ता को 'login_success' पथ पर रीडायरेक्ट करते हैं। मैं अपने लॉगिन फॉर्म में 'target_path_parameter' का उपयोग कर रहा हूं। मैं उपयोगकर्ता को उस पृष्ठ पर रीडायरेक्ट कैसे कर सकता हूं जिसे वह जाने वाला था (मुझे नहीं पता कि यह व्यवस्थापक पृष्ठ, उत्पाद पृष्ठ इत्यादि है)? –

5

एक काफी सरल समाधान अपने आवेदन में FOSUserBundle को लागू करने के रूप में डेटाबेस में प्रत्येक उपयोगकर्ता प्रविष्टि है (अन्य बातों के साथ) एक "LAST_LOGIN" क्षेत्र होगा।

संबंधित मुद्दे