2013-01-14 25 views
7

में लॉग इन रहें मैं Symfony2 का उपयोग कर किसी वेबसाइट पर पहुंचने के लिए एकल साइन इन करने का प्रयास कर रहा हूं।प्रोग्रामेटिक रूप से लॉग इन करें और

प्रमाणीकरण स्वयं ठीक काम करता प्रतीत होता है, लेकिन केवल प्रारंभिक पृष्ठ के लिए। लोड किए गए अगले पृष्ठ पर उपयोगकर्ता अब लॉग इन नहीं है।

प्रासंगिक कोड:

$token = new UsernamePasswordToken($user, null, 'main', $user->getRoles()); 
$event = new InteractiveLoginEvent($request, $token); 

$this->get("event_dispatcher")->dispatch(SecurityEvents::INTERACTIVE_LOGIN, $event); 
$this->get("security.context")->setToken($token); 

return $this->redirect($this->generateUrl('sonata_user_profile_show')); 

प्रथम पृष्ठ (पुन: निर्देशन के बिना):

Initial page - logged in

दूसरा पेज:

Second page - Not logged in anymore

+0

क्या आप सिम्फनी 2.1 का उपयोग कर रहे हैं? यदि ऐसा है, तो निम्न पंक्तियों को जोड़ने का प्रयास करें: '$ session-> सेट ('_ security_'। $ फ़ायरवॉलनाम, serialize ($ टोकन)); $ सत्र-> सहेजें(); ' – Squazic

+0

मुझे इस तरह की एक समस्या थी जिसमें एएसपी.NET वेब ऐप था जिस पर मैं काम कर रहा था। मैंने अपने कैश को अपने ब्राउज़र में साफ़ कर दिया और फिर से काम करना शुरू कर दिया। उम्मीद है कि यह आपके लिए भी आसान है :) – Anonymous

+0

@ स्क्वैज़िक हां, मैं सिम्फनी 2.1 का उपयोग कर रहा हूं। मैंने सत्र स्निपेट जोड़ा, लेकिन दुर्भाग्य से यह काम नहीं किया। –

उत्तर

6

कस्टम लॉग-इन के लिए केवल निम्नलिखित कोड आवश्यक है।

$token = new UsernamePasswordToken($user, null, 'main', $user->getRoles()); 
$this->get("security.context")->setToken($token); 

return $this->redirect($this->generateUrl('sonata_user_profile_show')); 

यह सुरक्षा संदर्भ में उपयोगकर्ता नाम पासवर्डवर्ड टोकन सेट कर रहा है। यह टोकन (और उपयोगकर्ता भी) को क्रमबद्ध किया जाएगा और सत्र में रखा जाएगा। अगले पृष्ठ पर टोकन सत्र से अनियमित हो जाएगा और, भी unserialized, उपयोगकर्ता ताज़ा किया जाएगा।

FOSUserBundle में उपयोगकर्ता-प्रदाता अनिश्चित उपयोगकर्ता की आईडी का उपयोग करके यह ताज़ा करता है।

इसके अलावा, कुछ मामलों में Doctrine2 मूल इकाई वर्ग की बजाय इकाई-वर्ग के रूप में प्रॉक्सी-वर्ग का उपयोग करता है। यह प्रॉक्सी-क्लास एक जटिल आलसी लोडिंग जटिल कार्यान्वयन द्वारा इकाई के "getId()" फ़ंक्शन को ओवरराइट करता है।

यह एक साथ इस तथ्य का कारण बन सकता है कि, जब आप UserPasswordToken में Doctrine2 प्रॉक्सी-ऑब्जेक्ट डालते हैं, तो serialized के "getId()" और फिर unserialized प्रॉक्सी-ऑब्जेक्ट मूल आईडी वापस नहीं करेगा। जब ऐसा होता है तो उपयोगकर्ता को उपयोगकर्ता-प्रदाता द्वारा रीफ्रेश नहीं किया जा सकता है, और टोकन अमान्य हो जाएगा।

इसके लिए एक फिक्स एक कस्टम उपयोगकर्ता-प्रदाता बना रहा है जो उपयोगकर्ता नाम (या एक अन्य अनूठी संपत्ति) का उपयोग करके ताज़ा करके "refreshUser()" को ओवरराइट करता है।

//... 
class UserProvider extends FOSUserProvider 
{ 
    /** 
    * {@inheritDoc} 
    */ 
    public function refreshUser(SecurityUserInterface $user) 
    { 
     if (!$user instanceof User) { 
      throw new UnsupportedUserException(sprintf('Expected an instance of User, but got "%s".', get_class($user))); 
     } 

     if (null === $reloadedUser = $this->userManager->findUserBy(array('username' => $user->getUsername()))) { 
      throw new UsernameNotFoundException(sprintf('User with username "%s" could not be reloaded.', $user->getUsername())); 
     } 

     return $reloadedUser; 
    } 
} 
संबंधित मुद्दे