2013-04-13 5 views
7

मैं इस उपयोगकर्ता प्रबंधक का निर्माण कर रहा हूं, जहां व्यवस्थापक समूह या उपयोगकर्ता की अनुमति बदल सकते हैं। मैं एफओएस उपयोगकर्ता बंडल का उपयोग नहीं करना चाहता, क्योंकि मैं बहुत अनुकूलित करना चाहता हूं।मैं टेम्पलेट में अन्य उपयोगकर्ताओं या भूमिका अनुमतियों को कैसे देख सकता हूं? symfony2

मुझे पता चला कि मैं नियंत्रक में किसी अन्य उपयोगकर्ता को अनुमति दे सकता हूं, लेकिन मैं किसी अन्य उपयोगकर्ता/भूमिका की अनुमति कैसे पढ़ सकता हूं? और क्या टेम्पलेट में किसी अन्य उपयोगकर्ता/भूमिका के इन अनुमतियों को पढ़ना संभव है?

आदर्श तरह से मैं यह करने के लिए चाहते हैं:

1 जाओ सभी वस्तुओं और नियंत्रक में उन

2 प्रिंट उपयोगकर्ताओं (एक पृष्ठ पर एक समूह के उपयोगकर्ताओं को और अनुमतियां देखने पर) और टेम्पलेट में वस्तुओं। ऑब्जेक्ट्स के बगल में, इस समूह की अनुमतियों को प्रिंट करें: देखें हटाएं हटाएं ..

और उपयोगकर्ता के लिए (वर्तमान में नहीं), मैं किसी उपयोगकर्ता की अनुमति की जांच करने में सक्षम होना चाहता हूं (वर्तमान नहीं) टेम्पलेट में। किसी दिए गए ऑब्जेक्ट/क्लास पर ..

मुझे पता है कि किसी उपयोगकर्ता की भूमिका/समूह है या नहीं, लेकिन मैं जानना चाहता हूं कि समूह/उपयोगकर्ता के पास एसीएल के साथ EDIT VIEW DELETE आदि जैसी अनुमतियां क्या हैं।

मैं इसे कैसे प्राप्त कर सकता हूं?

उत्तर

3

मुझे अंततः ऐसा करने का एक तरीका मिला, शायद यह करने का सबसे प्रभावी तरीका नहीं है लेकिन यह काम करता है और यह करने का एकमात्र तरीका है, क्योंकि कोई भी जानता है कि अब तक इसे कैसे प्राप्त किया जाए।

$defaultUser = $this->getDoctrine() 
    ->getRepository('TdfUserBundle:User') 
    ->findOneByUsername('-default-'.$group->getCode()); 

$sid = UserSecurityIdentity::fromAccount($defaultUser); 

मैं बनाने के लिए: मैं डिफ़ॉल्ट उपयोगकर्ता के लिए सुरक्षा आईडी प्राप्त -

सबसे पहले मैं हर समूह, जो प्रवेश नहीं कर सकते के लिए एक डिफ़ॉल्ट उपयोगकर्ता (समूह के लिए डिफ़ॉल्ट अनुमतियों के साथ एक डमी उपयोगकर्ता) है permisisons की एक सरणी के लिए जाँच करने के लिए और कुछ खाली सरणियों निर्धारित करते हैं, और वस्तुओं है कि मैं के लिए अनुमति जाँच करना चाहते हैं के माध्यम से problematic.acl_manager

$permissionsToCheck = array('VIEW', 'EDIT', 'CREATE', 'DELETE', 'OPERATOR', 'MASTER', 'OWNER'); 
$aclManager = $this->get('problematic.acl_manager'); 

तब मैं पाश लोड, और अनुमतियाँ मैं में पहले सेट की जाँच $ अनुमतियाँ varCockche var। मैं डिफ़ॉल्ट उपयोगकर्ता के लिए अनुमतियों की जांच करता हूं। परिणाम एक सरणी में रखा गया है जिसे मैं टेम्पलेट में भेजता हूं।

foreach($forumCategories as $forumCategory) : 
    $permissionArray[] = $this->checkPermissions($sid, $forumCategory, $permissionsToCheck, ''); 
endforeach; 

चेकप्रमिशन फ़ंक्शन अनुमतियों की एक सरणी देता है और मुझे दी गई वस्तु से कुछ चीज़ें चाहिए।

private function checkPermissions($sid, $object, $permissionsToCheck, $type) 
{ 
    $aclProvider = $this->get('security.acl.provider'); 
    $oid = ObjectIdentity::fromDomainObject($object); 
    try { 
     $acl = $aclProvider->createAcl($oid); 
    }catch(\Exception $e) { 
     $acl = $aclProvider->findAcl($oid); 
    } 
    $aclProvider->updateAcl($acl); 
    foreach ($permissionsToCheck as $permissionCode): 
     $permissionVar = 'can'.$permissionCode; 
     $builder = new MaskBuilder(); 
     $builder->add($permissionCode); 
     $mask = $builder->get(); 
     try { 
      $$permissionVar = $acl->isGranted(array($mask),array($sid)); 
     } catch(\Exception $e) { 
      $$permissionVar = false; 
     } 
     $tempPermissionsArray[$permissionCode] = $$permissionVar; 
    endforeach; 

    $returnArray = array('id' => $object->getId(),'title' => $object->getTitle(),'slug' => $object->getSlug(),'type' => $type, 'permissions' => $tempPermissionsArray); 
    return $returnArray; 

} 

फॉर्म के पोस्ट के बाद मैं जांचता हूं कि ऑब्जेक्ट की अनुमतियां किस प्रकार बदल गई हैं, यदि ऐसा है तो मैं समूह के सभी उपयोगकर्ताओं के माध्यम से लूप करता हूं।प्रत्येक उपयोगकर्ता के लिए, अनुमतियों को निरस्त करें, फिर सभी समूह (समूह के लिए डिफ़ॉल्ट उपयोगकर्ता) प्राप्त करें। प्रति समूह (डिफ़ॉल्ट उपयोगकर्ता) अनुमति की जांच करें, जांचें कि कौन सी अनुमतियां सक्रिय हैं और उपयोगकर्ता को सही अनुमतियां दें।

यहां मैं सभी अनुमतियों को झूठी और फिर सभी भूमिकाओं/समूहों (डिफ़ॉल्ट उपयोगकर्ताओं) के माध्यम से लूप सेट करता हूं और देखता हूं कि अनुमति सेट की जानी चाहिए या नहीं।

foreach($array['permissions'] as $permissionCode => $test): 
     $$permissionCode = false; 
    endforeach; 

    foreach($user->getRoles() as $role): 
     $role = str_replace('ROLE_', '', $role); 

     $defaultUser = $this->getDoctrine() 
      ->getRepository('TdfUserBundle:User') 
      ->findOneByUsername('-default-'.$role); 
     $sid = UserSecurityIdentity::fromAccount($defaultUser); 


     // See all permissions 
     foreach($array['permissions'] as $permissionCode => $test): 
      $builder = new MaskBuilder(); 
      $builder->add($permissionCode); 
      $mask = $builder->get(); 
      try { 
       $isGranted = $acl->isGranted(array($mask),array($sid)); 
       if($isGranted): 
        $$permissionCode = true; 
       endif; 
      } catch(\Exception $e) { 

      } 
     endforeach; 
    endforeach; 

इस के बाद मुझे पता है कि अधिकार उपयोगकर्ता होना चाहिए और फिर उस खाते सभी अधिकार दे:

$aclManager = $this->get('problematic.acl_manager'); 

$aclManager->revokeAllObjectPermissions($object, $user); 

$mapping = array(
     'VIEW'  => MaskBuilder::MASK_VIEW, 
     'EDIT'  => MaskBuilder::MASK_EDIT, 
     'CREATE' => MaskBuilder::MASK_CREATE, 
     'UNDELETE' => MaskBuilder::MASK_UNDELETE, 
     'DELETE' => MaskBuilder::MASK_DELETE, 
     'OPERATOR' => MaskBuilder::MASK_OPERATOR, 
     'MASTER' => MaskBuilder::MASK_MASTER, 
     'OWNER'  => MaskBuilder::MASK_OWNER, 
    ); 
foreach($array['permissions'] as $permissionCode => $test): 
    if($$permissionCode): 
     $mask = $mapping[$permissionCode]; 
     $aclManager->addObjectPermission($object, $mask, $user); 
    endif; 
endforeach; 
25

आप देख सकते हैं वर्तमान उपयोगकर्ता समारोह is_granted

{% if is_granted('ROLE_USER') %} 
    {{ app.user.username }} 
{% endif %} 

का उपयोग कर टहनी में मौजूदा उपयोगकर्ताओं भूमिकाओं सरणी हो रही द्वारा टहनी से एक भूमिका है:

{{ app.user.roles }} 

आप प्रदर्शित करना चाहते हैं, तो उपयोगकर्ताओं के संग्रह से, आप ऐसा कुछ कर सकते हैं (उपयोगकर्ताओं के रूप में पारित संग्रह मानते हैं)

{% for user in users %} 
    <p> 
    {{ user.username }}: 
    {% for role in user.roles %} 
     {{ role }} 
    {% endfor %} 
    </p> 
{% endfor %} 
+0

मैं माफी चाहता हूँ, लगता है कि मैं काफी स्पष्ट नहीं था। मैं अन्य उपयोगकर्ताओं को एसीएल के साथ अनुमति की जांच करना चाहता हूं, जैसे कि किसी उपयोगकर्ता के पास EDIT अधिकार हैं, या यदि किसी भूमिका में EDIT अधिकार हैं, या कोई .. मुझे पता है कि मैं भूमिकाओं की जांच कर सकता हूं, मुझे पता चला कि मैं कैसे कर सकता हूं मुझे इस भूमिका के लिए अनुमतियां दिखाई देती हैं? मैं थोड़ा और स्पष्ट क्षमा करने के लिए अपने प्रश्न को संपादित करूंगा – Arazu

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

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