W końcu znalazłem sposób na zrobienie tego, prawdopodobnie nie jest to najskuteczniejszy sposób na zrobienie tego, ale działa i jest jedynym sposobem, w jaki to robię, ponieważ nikt nie wie, jak to osiągnąć do tej pory.
Najpierw muszę użytkownika domyślnego dla każdej grupy, która nie mogę się zalogować (nieaktywnego użytkownika z uprawnieniami domyślnych dla grupy) - dostaję Security ID dla domyślnego użytkownika:
$defaultUser = $this->getDoctrine()
->getRepository('TdfUserBundle:User')
->findOneByUsername('-default-'.$group->getCode());
$sid = UserSecurityIdentity::fromAccount($defaultUser);
tworzę tablica permisisons sprawdzić i ustawić kilka pustych tablic i załadować problematic.acl_manager
$permissionsToCheck = array('VIEW', 'EDIT', 'CREATE', 'DELETE', 'OPERATOR', 'MASTER', 'OWNER');
$aclManager = $this->get('problematic.acl_manager');
Potem pętli przez obiekty, które chcę sprawdzić zgody na i sprawdzić uprawnienia ustawić wcześniej w $ permissionsToCheck var. Sprawdzam uprawnienia domyślnego użytkownika. Wynik umieszczany jest w tablicy, którą wysyłam do szablonu.
foreach($forumCategories as $forumCategory) :
$permissionArray[] = $this->checkPermissions($sid, $forumCategory, $permissionsToCheck, '');
endforeach;
Funkcja checkPermissions zwraca tablicę uprawnień i niektórych rzeczy, których potrzebuję z podanego obiektu.
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;
}
Po napisie POST formularza, sprawdzam, do jakiego obiektu zostały zmienione uprawnienia, jeśli tak, przeglądam wszystkich użytkowników w grupie.Dla każdego użytkownika odwołać uprawnienia, a następnie uzyskać wszystkie grupy (domyślny użytkownik dla grupy). sprawdź uprawnienia dla grupy (domyślny użytkownik), sprawdź uprawnienia do aktywacji i daj użytkownikowi prawidłowe uprawnienia.
Tutaj ustawiam wszystkie uprawnienia na false, a następnie przechodzę przez wszystkie role/grupy (domyślni użytkownicy) i sprawdzam, czy uprawnienia powinny być ustawione.
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;
Po tym wiem, jakie prawa użytkownik powinien mieć i wtedy dać uwagę wszystkie uprawnienia:
$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;
Przepraszam, chyba nie był wystarczająco jasny. Chcę sprawdzić uprawnienia innych użytkowników za pomocą listy ACL, np. Sprawdzając, czy użytkownik ma uprawnienia EDYTUJ, czy rola ma uprawnienia EDIT, czy też dowolny. Wiem, że mogę sprawdzić role, znalazłem to, ale pytałem, jak można Widzę uprawnienia do tej roli? Zmienię moje pytanie, aby było bardziej zrozumiałe, przepraszam – Arazu