2013-02-01 11 views
5

Sto costruendo un'applicazione Web utilizzando Symfony2. Ho implementato i moduli ACL e ha funzionato perfettamente, ma sono incappato in un problema quando cercavo di fare un pannello per gestire i diritti.Ottenere gli ACL per un altro utente rispetto a quello registrato in Symfony2?

Così ho avuto come utente che può creare un progetto e aggiungere "partecipanti" al suo progetto. I partecipanti possono avere tre diversi tipi di accesso che sono maschere dal costruttore di maschere MASK_VIEW, MASK_EDIT, MASK_OPERATOR. Utilizzando il ProblematicAclManagerBundle possiamo aggiungere facilmente l'accesso a questi utilizzando fare questo:

$this->aclManager->addObjectPermission($project, $mask, $user); 

Il fatto è che quando si desidera modificare il progetto, devi essere in grado di elencare gli utenti con i loro diritti di accesso correnti. La funzione isGranted può farti gli utenti giusti per l'utente loggato corrente, ma non per altri utenti. Rispetto alle funzioni addXXXX in cui sono presenti tre argomenti, lo isGranted ha solo due, l'oggetto protetto e la maschera. Pertanto non è possibile trovare il diritto per un altro utente con questa funzione.


Esiste un modo per ottenere i diritti di altri utenti incorporati? O devo costruire le mie query SQL per estrarre i dati dalle tabelle acl?

risposta

1

Ecco quello che ho in questo momento ... Ho fatto una query SQL crudo con seleziona nidificati.

//... 
$objectClass = get_class($object); 
$objectId = $object->getId(); 
$userSecurityIdentity = get_class($user) . '-' . $user->getUsername(); 

$sql = "SELECT `mask` FROM `acl_entries`" . 
     "WHERE `object_identity_id` in (" . 
      "SELECT `id` FROM `acl_object_identities` " . 
      "WHERE `object_identifier` = :objectId AND `class_id` in (" . 
       "SELECT `id` FROM `acl_classes` WHERE `class_type` = :objectClass" . 
      ")" . 
     ")" . 
     "AND `security_identity_id` in (" . 
      "SELECT `id` FROM `acl_security_identities`" . 
      "WHERE `identifier` = :userSecurityIdentity" . 
     ");"; 

$query = $this->entityManager->getConnection()->executeQuery($sql, array(
    'objectId'    => $objectId, 
    'objectClass'   => $objectClass, 
    'userSecurityIdentity' => $userSecurityIdentity) 
); 

$data = $query->fetch(); 
$mask = $data['mask']; 
// ... 

Questa soluzione funziona, ma non è il migliore per me dato che effettivamente query direttamente al tavolo invece di utilizzare il modulo di ACL, io aggiornare se trovo qualcosa di diverso.

1

Forse si può provare a mettere un altro token nel contesto di sicurezza, legato ad un altro utente:

$securityContext->setToken(new Token($user2)); 
$securityContext->isGranted('test', $object); 
+0

Thing con quello è che avrei dovuto creare un nuovo token che si estende TokenInterface. Quindi simulare l'utente come autenticato. È un po 'hacky ma funzionerebbe –

0

bene la Symfony\Component\Security\Acl\Model\AclInterface fornisce questo metodo:

/** 
* Determines whether access is granted 
* 
* @throws NoAceFoundException when no ACE was applicable for this request 
* @param array $masks 
* @param array $securityIdentities 
* @param Boolean $administrativeMode 
* @return Boolean 
*/ 
public function isGranted(array $masks, array $securityIdentities, $administrativeMode = false); 
+1

La cosa è dove metti l'oggetto. Quando inserisci una riga fai '($ maschera, $ oggetto, $ utente)'. Questo non sembra fornire un argomento per "$ oggetto" o "$ utente". –

+0

Sembra controllare se 'identity' ha la' maschera' in qualsiasi oggetto/classe implementato –

Problemi correlati