ho finalmente trovato un modo per fare questo, la sua, probabilmente non è il modo più efficace di fare questo, ma funziona ed è l'unico modo che conosco di fare questo, come nessuno sa come raggiungere questo fino ad ora.
Prima Ho un utente di default per ogni gruppo, che non possono login (un utente fittizio con le autorizzazioni predefinite per il gruppo) - ho l'ID di sicurezza per l'utente predefinito:
$defaultUser = $this->getDoctrine()
->getRepository('TdfUserBundle:User')
->findOneByUsername('-default-'.$group->getCode());
$sid = UserSecurityIdentity::fromAccount($defaultUser);
creo un array di permisisons verificare e impostare alcuni array vuoti, e caricare il problematic.acl_manager
$permissionsToCheck = array('VIEW', 'EDIT', 'CREATE', 'DELETE', 'OPERATOR', 'MASTER', 'OWNER');
$aclManager = $this->get('problematic.acl_manager');
Poi scorrere gli oggetti che voglio controllare l'autorizzazione per, e controllare le autorizzazioni ho impostato prima nella $ permissionsToCheck var. Controllo le autorizzazioni per l'utente predefinito. Il risultato è messo in una matrice che invio al modello.
foreach($forumCategories as $forumCategory) :
$permissionArray[] = $this->checkPermissions($sid, $forumCategory, $permissionsToCheck, '');
endforeach;
La funzione checkPermissions restituisce un array di autorizzazioni e alcune cose necessarie dall'oggetto.
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;
}
Dopo il POST del modulo, controllo quale oggetto ha le sue autorizzazioni modificate, in tal caso faccio scorrere tutti gli utenti nel gruppo.Per ogni utente, revocare le autorizzazioni, quindi ottenere tutti i gruppi (utente predefinito per il gruppo). autorizzazione per gruppo (utente predefinito), controllare quali autorizzazioni attivare e fornire all'utente le autorizzazioni corrette.
Qui imposto tutte le autorizzazioni su false e quindi eseguo il ciclo di tutti i ruoli/gruppi (utenti predefiniti) e verificare se è necessario impostare il permesso.
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;
Dopo questo, io so quali sono i diritti che l'utente dovrebbe avere e quindi dare il conto di tutti i diritti:
$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;
Mi dispiace, immagino che non sono stato abbastanza chiaro. Voglio controllare l'autorizzazione di altri utenti con ACL, come controllare se un utente ha diritti di EDIT, o se un ruolo ha diritti di EDIT, o qualsiasi .. So che posso controllare i ruoli, l'ho scoperto, ma stavo chiedendo come può Vedo le autorizzazioni per questo ruolo? Modificherò la mia domanda per essere un po 'più chiara scusa – Arazu