2011-06-16 6 views
21

सिम्फनी 2 के साथ बनाए गए एप्लिकेशन में हम चाहते हैं कि सुपरडमिन्स अन्य उपयोगकर्ताओं का प्रतिरूपण करने में सक्षम हों। यह सुपरडमिन उपयोगकर्ता ROLE_ALLOWED_TO_SWITCH भूमिका देकर आसानी से किया जाता है। संदर्भ दस्तावेज में सुझाए गए अनुसार "कहीं कहीं? _switch_user =" को कॉल के साथ स्विचिंग लागू किया गया है।सिमफ़ोनी 2 में उपयोगकर्ता का प्रतिरूपण किया जा रहा है या नहीं, इसकी पहचान कैसे करें?

समस्या हालांकि, वर्तमान उपयोगकर्ता का वास्तव में प्रतिरूपित किया गया है ताकि पृष्ठ पर "कहीं? _switch_user = _exit" के लिंक को प्रिंट करने के लिए, इस प्रकार समस्या का उपयोग करने वाले उपयोगकर्ता को अपने वास्तविक उपयोगकर्ता को वापस करने में सक्षम बनाता है। ।

उत्तर

29

मैं थोड़ी देर के लिए सिम्फनी 2 का उपयोग नहीं कर रहा हूं, इसलिए मुझे यकीन नहीं है, लेकिन जब आप किसी अन्य उपयोगकर्ता पर स्विच करते हैं तो आपको उस उपयोगकर्ता को आवंटित सभी भूमिकाएं मिलती हैं और एक अतिरिक्त भूमिका: ROLE_PREVIOUS_ADMIN। इसलिए मुझे लगता है कि मतदाता का उपयोग करके वर्तमान उपयोगकर्ता को ऐसी भूमिका नियुक्त की गई है या नहीं, यह देखने के लिए आपको मतदाता का उपयोग करना है।

// Twig 

{% if is_granted('ROLE_PREVIOUS_ADMIN') %} 
    <a href="...?_switch_user=_exit">EXIT</a> 
{% endif %} 

// PHP 

<?php if ($view['security']->isGranted('ROLE_PREVIOUS_ADMIN')): ?> 
    <a href="...?_switch_user=_exit">EXIT</a> 
<?php endif ?> 
+2

अभिनय की आईडी प्राप्त करने के लिए वैसे भी वहाँ है? यह उन परिदृश्यों के लिए उपयोगी होगा जहां प्रतिरूपणकर्ता अद्यतन कर रहे हैं और हम लेखा परीक्षक को प्रतिरूपणकर्ता की मूल आईडी को पहचानना चाहते हैं। – anushr

+0

@anushr: हाँ, '? _switch_user = _exit' का उपयोग करें (यह कम से कम [2.3] (http://symfony.com/doc/2.3/cookbook/security/impersonating_user.html) से मौजूद है)। अतिरिक्त ज्ञान के लिए –

18

कैसे अभिनय के बारे में अधिक जानकारी प्राप्त करने के लिए का एक उदाहरण:

use Symfony\Component\Security\Core\Role\SwitchUserRole; 


$sec = $this->get('security.context'); 

if($sec->isGranted('ROLE_PREVIOUS_ADMIN')) { 
    foreach($sec->getToken()->getRoles() as $role) { 
    if ($role instanceof SwitchUserRole) { 
     $admin_user = $role->getSource()->getUser(); 
    } 
    } 
} 

फिर आप मूल उपयोगकर्ता वस्तु के रूप में admin_user है। SwitchUserRole का उपयोग करना याद रखें।

+0

+1। – flu

+2

+1 मुझे अपना पता दें और मैं आपको कुकीज़ भेजूंगा। – Ascherer

+1

हालांकि ध्यान देने योग्य है, अगर आपके पास अपने उपयोगकर्ता पर विदेशी कुंजी है, तो सुरक्षा में हाइड्रेटेड आइटम नहीं होंगे – Ascherer

2

कैसे टहनी में अभिनय प्रदर्शित करने के लिए का एक उदाहरण:

{% if is_granted('ROLE_PREVIOUS_ADMIN') %} 
    {% for role in app.security.token.roles %} 
    {% if role.role == 'ROLE_PREVIOUS_ADMIN' %} 
     {{ role.source.user.username }} 
    {% endif %} 
    {% endfor %} 
{% endif %} 
+0

क्या आप सिम्फनी 3 में ऐसा कैसे करते हैं? 'App.security' चर को हटा दिया गया है और हटा दिया गया है, और अब मैं एक विकल्प ढूंढ रहा हूं कि हम नवीनतम संस्करण में अपडेट कर रहे हैं। – user128216

+1

@FighterJet app.security – WayFarer

+0

'app.token_storage' के बजाय' app.token_storage' का उपयोग करने के लिए प्रतीत नहीं होता है, [docs] (http://symfony.com/doc/current/reference/twig_reference] के अनुसार .html # ऐप) ... – user128216