2013-04-13 7 views
7

Buduję tego menedżera użytkowników, gdzie administratorzy mogą zmieniać uprawnienia grupy lub użytkownika. Nie chcę używać pakietu użytkownika FOS, ponieważ chcę dostosować alot.Jak mogę sprawdzić innych użytkowników lub uprawnienia ról w szablonie? symfony2

Dowiedziałem się, że mogę dać uprawnienia innemu użytkownikowi w kontrolerze, ale w jaki sposób mogę odczytać uprawnienia innego użytkownika/roli? I czy jest możliwe odczytanie tych uprawnień innego użytkownika/roli w szablonie?

idealny sposób chciałbym to zrobić: (strona aby zobaczyć użytkowników w grupie oraz sekcji publicznej)

1 Zdobądź wszystkie obiekty i użytkowników w kontrolerze

2 wydrukować użytkowników i obiekty w szablonie. Obok obiektów wypisz uprawnienia, które ma ta grupa: ZOBACZ EDYTUJ USUŃ WŁAŚCICIELA ..

Tak samo dla użytkownika (nie obecnego), chcę mieć możliwość sprawdzenia uprawnień użytkownika (nie bieżącego) w szablonie. Na danym obiekcie/klasie ..

Wiem, jak sprawdzić, czy użytkownik ma rolę/grupę, ale chcę wiedzieć, jakie uprawnienia ma grupa/użytkownik, jak EDIT VIEW DELETE itp. Z ACL.

Jak mogę to osiągnąć?

Odpowiedz

3

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; 
25

Można sprawdzić, czy bieżący użytkownik ma swoją rolę przez gałązce za pomocą funkcji is_granted

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

Pierwsze obecnych użytkowników ról tablicę w gałązce:

{{ app.user.roles }} 

Jeśli chcą, aby wyświetlić z kolekcji użytkowników możesz zrobić coś takiego (zakładając, że kolekcja przeszła jako użytkownicy).

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

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

Powiązane problemy