मुझे अंततः ऐसा करने का एक तरीका मिला, शायद यह करने का सबसे प्रभावी तरीका नहीं है लेकिन यह काम करता है और यह करने का एकमात्र तरीका है, क्योंकि कोई भी जानता है कि अब तक इसे कैसे प्राप्त किया जाए।
$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;
मैं माफी चाहता हूँ, लगता है कि मैं काफी स्पष्ट नहीं था। मैं अन्य उपयोगकर्ताओं को एसीएल के साथ अनुमति की जांच करना चाहता हूं, जैसे कि किसी उपयोगकर्ता के पास EDIT अधिकार हैं, या यदि किसी भूमिका में EDIT अधिकार हैं, या कोई .. मुझे पता है कि मैं भूमिकाओं की जांच कर सकता हूं, मुझे पता चला कि मैं कैसे कर सकता हूं मुझे इस भूमिका के लिए अनुमतियां दिखाई देती हैं? मैं थोड़ा और स्पष्ट क्षमा करने के लिए अपने प्रश्न को संपादित करूंगा – Arazu