2014-05-21 19 views
5

Ich baue System und versuche zwischen Wähler und ACL zu entscheiden. Was ich erreichen muss, ist, dass Benutzer mit verschiedenen Rollen auf Objekteigenschaften zugreifen sollen, zum Beispiel: Ein regulär authentifizierter Benutzer könnte Post und seinen Inhalt sehen, aber nicht sein "Position" -Attribut, und Benutzer mit Redakteur-Rolle könnte auch die Post und sehen Es ist Inhalt und hat die Berechtigung, das Attribut "Position" zu sehen und zu bearbeiten. Kann ich diese Funktionalität erreichen, indem ich nur Wähler verwende oder ACL verwenden muss?symfony2 Wähler oder acl

EDIT:

Es tut mir leid für die verwirrende Frage, ich bin neu in symfony und nicht ganz noch diese Konzepte verstehen. Was ich erreichen möchte, sind Berechtigungen auf Objektfeldebene. enter image description here

Regelmäßige Nutzer „TITEL“ zugreifen können und „CONTENT“ Eigenschaften und „CONTENT“ Eigentum“ändern, kann Moderator anzuzeigen und zu bearbeiten, die beiden vorherigen Eigenschaften, und Admin soll Zugriff auf alle Objekteigenschaften hat, und tut

Antwort

11

Die Dokumente erklären nur, wie man den Zugriff auf Objekte statt auf Eigenschaften prüft Ich werde die Entscheidungen erklären, die ich bin ke bei der Wahl zwischen Wählern oder ACL. Als nächstes werde ich erklären, wie Sie (Hierachy) Wähler verwenden können, um Ihr Ziel zu erreichen.


  1. Wenn Benutzer einfach oder haben keinen Zugang zu einem Objekt auf einer Rolle basiert, kann der Zugriff durchgeführt werden, um die Firewall und ist die einfachste Lösung.

  2. Wenn jedoch der Zugriff von Objekt zu Objekt unter bestimmten Regeln abhängt, sollte ein Voter verwendet werden. Ein Beispiel: Benutzer können einen Beitrag nur bearbeiten, wenn er erstellt wurde. Aber Moderatoren sollten immer einen Post bearbeiten können.

  3. Die schwierigste Zugriffssteuerung ist, wenn einem Benutzer der Zugriff durch einen anderen Benutzer gewährt werden kann. Beispielsweise kann ein Administrator Benutzer einem Beitrag zuweisen und ihnen Bearbeitungsberechtigungen erteilen. Dies ist eine Lösung, bei der der Zugriff nicht allein aufgrund der Rolle des Benutzers entschieden werden kann. Der Zugriff/die Berechtigungen müssen pro Benutzer für ein Objekt gespeichert werden. Dies ist, was ACL tut. Es speichert Berechtigungen für Objekte in der Datenbank pro Benutzer.


Wie für Ihr Problem. Meistens werden diese Arten von Verwendungen im Code selbst behandelt. Ich habe viele verschiedene Formen für eine Entität gesehen. UserPostFormType, ModeratorPostFormType und AdminPostFormType. Das ist nicht sehr trocken, wie Sie sehen können. Überprüfen Sie den Typ des Benutzers im Code

Erwägen Sie, Rollen zu definieren und sie mithilfe der Hierarchie zu verwalten.

Definieren Sie separate Rollen pro Eigenschaft pro Aktion. Definieren Sie die folgenden Rollen.

ROLE_ID_VIEW 
ROLE_ID_EDIT 
ROLE_TITLE_VIEW 
ROLE_TITLE_EDIT 
... 

Sie können diese Rollen dann der richtigen Benutzerrolle zuweisen.

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] 

Sie können nun die Hierarchie Voter, um zu überprüfen, ob ein Benutzer eine bestimmte Eigenschaft ändern oder anzuzeigen. Die sauberste Lösung wäre, einen Listener auf Ihrem Formular zu erstellen, der Felder auf Ihren Formularen basierend auf den Berechtigungen des aktuellen Benutzers hinzufügt.

+0

Danke, ich habe dieses Problem auf eine ähnliche Art und Weise (durch das Erstellen von Benutzerrollen, aber ohne eigenes Feld) vor einiger Zeit gelöst . Deine Antwort macht mehr Sinn. –

-1

Wähler haben nichts mit ACL zu tun.Wähler Bedenken ist Route Zugriff, während ACL betrifft Objekt Lese-/Schreibzugriff.So ist es nicht das eine oder das andere, weil sie nichts miteinander zu tun haben.

+4

Aus [Symfony docs] (http://symfony.com/doc/current/cookbook/security/acl.html) "Die Verwendung von ACLs ist nicht trivial, und für einfachere Anwendungsfälle (...) sollten Sie Wähler verwenden . " – albertedevigo

+0

Ich benutze die Wähler, um zu überprüfen, ob ein Benutzer auf ein Objekt zugreifen kann, wenn die Route eine Art Objekt-ID enthält. Außerdem kannst du ein Objekt an einen Wähler weitergeben, also verstehe ich nicht, warum du das nicht tun konntest ... –