2013-04-13 11 views
7

sto costruendo questo User Manager, dove gli amministratori possono cambiare il permesso di un gruppo o utente. Non voglio utilizzare il fascio utente FOS, perché voglio personalizzare molto.Come posso controllare altri utenti o autorizzazioni di ruolo nel modello? Symfony2

ho scoperto che posso dare autorizzazioni per un altro utente nel controller, ma come posso leggere i permessi di un altro utente/ruolo? Ed è possibile leggere questi permessi di un altro utente/ruolo nel modello?

il modo ideale vorrei fare questo è: (una pagina per visualizzare gli utenti in un gruppo e le permissons)

1 Get tutti gli oggetti e gli utenti nel controller

2 Stampa gli utenti e oggetti nel modello. Accanto agli oggetti, stampa i permessi di questo gruppo: VISUALIZZA MODIFICA CANCELLA TITOLARE ..

E lo stesso per un utente (non corrente), voglio essere in grado di controllare il permesso di un utente (non l'attuale) nel modello. Su un oggetto determinato/class ..

Io so come controllare se un utente ha un ruolo/gruppo, ma voglio sapere quali autorizzazioni del gruppo/utente ha, come modificare vista CANCELLA ecc con ACL.

Come posso ottenere questo risultato?

risposta

3

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

È possibile controllare se l'utente corrente ha un ruolo da ramoscello utilizzando la funzione is_granted

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

Ottenere l'attuale gamma ruoli degli utenti in ramoscello:

{{ app.user.roles }} 

Se si vogliono visualizzare da una raccolta di utenti, puoi fare qualcosa di simile (assumendo la raccolta passata come utenti)

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

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

Problemi correlati