2012-08-28 20 views
5

मेरे पास एक ऐसा एप्लिकेशन है जिसमें मेरे पास एक सुपरडमिन भूमिका है और विभिन्न विशेषाधिकारों के साथ विभिन्न उपयोगकर्ता भूमिकाएं हैं।symfony _switch_user के लिए कैसे सुनता है?

पर दिखाए गए अनुसार, इनमें से किसी भी उपयोगकर्ता को _switch_user क्वेरी का उपयोग करके प्रतिरूपण करने में सक्षम होना चाहते हैं, हालांकि, जब मैं अपने यूआरएल के अंत में क्वेरी जोड़ता हूं, तो ऐसा कुछ नहीं लगता है। मैंने अब इसके साथ लंबे समय से खेला है और मुझे कोई समाधान नहीं मिल रहा है। मुझे पता है कि जिस उपयोगकर्ता में मैंने लॉग इन किया है, उसके पास ROLE_ALLOWED_TO_SWITCH है, लेकिन मुझे लगता है कि यह सिमफ़ोनी कैसे करता है यह समझ में नहीं आता है।

मैं एक कस्टम प्रमाणीकरण प्रदाता का उपयोग कर रहा हूं, इसलिए मुझे लगता है कि इसके साथ कुछ करने के लिए कुछ है, लेकिन मुझे यकीन नहीं है कि मुझे क्या देखना है। मैं किसी भी कोड की आवश्यकता पोस्ट कर सकता हूं, लेकिन मुझे सच में यकीन नहीं है कि अभी क्या पोस्ट करना है।

उत्तर

4

तो मैंने कुछ और खोद दिया और पाया कि Listener कक्षा मेरे कस्टम प्रमाणीकरण प्रदाता के लिए ठीक से लिखा नहीं गया था। यह लिखा गया था कि प्रत्येक पृष्ठ लोड पर एक नया Token बनाया गया था।

परिणामस्वरूप दो चीजें करने की आवश्यकता है।

पहला प्रमाणीकरण श्रोता Symfony Firewall Listeners के समान होने के लिए बदलना था, जिसकी सामान्य संरचना नीचे दिखाया गया है।

if (null !== $token = $this->securityContext->getToken()) { 
    if ($token instanceof UsernamePasswordToken && $token->isAuthenticated() && 
     $token->getUsername() === $username) { 
      return; 
    } 
} 

ये श्रोताओं मूल रूप से कुछ शर्तों को पकड़ने के बिना प्रमाणीकरण को एक नया टोकन बनाने के बिना आगे बढ़ने की अनुमति देते हैं। ये स्थितियां हैं कि टोकन सही टोकन का एक उदाहरण है, यह प्रमाणित है, और उपयोगकर्ता नाम लॉग इन उपयोगकर्ता के मेल खाता है।

दूसरा, इस कोड को मूल उपयोगकर्ता के आधार पर प्रमाणीकरण की जांच करने के लिए संशोधित किया जाना चाहिए यदि उसने उपयोगकर्ताओं को स्विच करने का प्रयास किया। This issue किसी और की समान समस्या का विवरण देता है। फिक्स को SwitchUserRole खोजने के लिए भूमिकाओं के माध्यम से चक्र बनाना था और प्रमाणीकृत करने के लिए उस डेटा का उपयोग करना था। मैंने नीचे पैच की प्रतिलिपि बनाई है, जो उपरोक्त if कथन के बाद जाएगी।

foreach ($token->getRoles() as $role) { 
    if ($role instanceof SwitchUserRole) { 
     $token = $role->getSource(); 
      break; 
    } 
} 

साथ में, प्रमाणीकरण श्रोता केवल नया टोकन बनाने अगर यह कुछ शर्तों और किसी ऐसे उपयोगकर्ता को धारण कर रहा है एक और अपने क्रेडेंशियल्स के बजाय उपयोगकर्ता वे कर रहे हैं की इस बात का परीक्षण प्रमाणीकरण के लिए इस्तेमाल किया होगा पास नहीं होगा प्रतिरूपण करने की कोशिश कर रहा है।

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