2014-05-21 18 views
5

Sto costruendo un sistema e sto cercando di decidere tra gli elettori e l'ACL. Quello che devo raggiungere è che ci devono essere utenti con ruoli diversi per accedere alle proprietà dell'oggetto, ad esempio: un utente autenticato regolarmente può vedere Post e il suo contenuto ma non l'attributo "Posizione", e il ruolo Utente con editor potrebbe anche vedere il Post e è contenuto e ha la possibilità di vedere l'attributo "Posizione" e modificarlo. Posso ottenere questa funzionalità utilizzando solo gli elettori o devo usare ACL?symfony2 voters o acl

EDIT:

Mi dispiace per la domanda di confusione, Sono nuovo di symfony e non ancora del tutto a capire questi concetti. Quello che non voglio ottenere sono le autorizzazioni a livello di campo dell'oggetto. enter image description here

utente normale può accedere alle proprietà "contenuto" "Titolo" e, e modificare "contenuto" proprietà", moderatore può visualizzare e modificare, entrambi di proprietà precedenti, e admin dovrebbero avere accesso a tutte le proprietà degli oggetti, e fare

risposta

11

I documenti spiegano solo come controllare l'accesso agli oggetti anziché alle proprietà. Spiegherò le decisioni che ho ke quando si sceglie tra elettori o ACL. Poi ti spiegherò come puoi usare gli elettori (Hierachy) per raggiungere il tuo obiettivo.


  1. Quando gli utenti devono semplicemente avere o non avere accesso a un oggetto in base a un ruolo, l'accesso può essere eseguito utilizzando il firewall ed è la soluzione più semplice.

  2. Tuttavia, quando l'accesso dipende da una base per oggetto in determinate regole, è necessario utilizzare un elettore. Un esempio, gli utenti possono modificare un post solo quando lo hanno creato. Ma i moderatori dovrebbero essere sempre abili nel modificare un post.

  3. Il controllo di accesso più difficile è quando un utente può ottenere l'accesso da un altro utente. Ad esempio, un amministratore può assegnare gli utenti a un post e concedere loro le autorizzazioni di modifica. Questa è una soluzione in cui l'accesso non può essere deciso basandosi esclusivamente sul ruolo dell'utente. Gli accessi/permessi devono essere memorizzati per utente per un oggetto. Questo è ciò che ACL fa. Memorizza le autorizzazioni sugli oggetti nel database per utente.


Per quanto riguarda il vostro problema. Principalmente questi tipi di utilizzo sono gestiti nel codice stesso. Ho visto molte forme diverse per un'entità. UserPostFormType, ModeratorPostFormType e AdminPostFormType. Questo non è molto secco come puoi vedere. E verificare il tipo di utente nel codice

Prendere in considerazione la definizione dei ruoli e gestirli utilizzando la gerarchia.

Definire ruoli separati per proprietà per azione. Definisce quindi i seguenti ruoli.

ROLE_ID_VIEW 
ROLE_ID_EDIT 
ROLE_TITLE_VIEW 
ROLE_TITLE_EDIT 
... 

È quindi possibile assegnare questi ruoli al ruolo utente corretto.

security: 
    role_hierarchy: 
     ROLE_USER:  [ROLE_TITLE_VIEW, ROLE_CONTENT_VIEW, ROLE_CONTENT_EDIT] 
     ROLE_MODERATOR: [ROLE_USER, ROLE_TITLE_EDIT] 
     ROLE_ADMIN:  [ROLE_MODERATOR, ROLE_ID_EDIT, ROLE_ID_VIEW] 

È ora possibile utilizzare Gerarchia Votazione per verificare se un utente può modificare o visualizzare una determinata proprietà. La soluzione più pulita sarebbe quella di creare un listener sul modulo che aggiunge campi sui moduli in base alle autorizzazioni dell'utente corrente.

+0

Grazie, ho risolto questo problema in modo simile (creando ruoli utente, ma senza campo singolo) qualche tempo fa . La tua risposta ha più senso. –

-1

Gli elettori non hanno nulla a che fare con ACL. L'interesse degli elettori è l'accesso al percorso mentre il problema di ACL è l'accesso in lettura/scrittura. Quindi non è l'uno o l'altro perché non hanno nulla a che fare l'uno con l'altro

+4

Da [Symfony docs] (http://symfony.com/doc/current/cookbook/security/acl.html) "L'uso di ACL non è banale, e per casi di utilizzo più semplici (...) considerare l'utilizzo degli elettori ". – albertedevigo

+0

Uso gli elettori per verificare se un utente può accedere a un oggetto quando il percorso contiene qualche tipo di ID oggetto. Inoltre puoi passare un oggetto a un votante quindi non capisco perché non potresti farlo ... –