Symfony 2 - ACL-Prüfberechtigung basierend auf separaten Rollen

8

Nehmen wir an, wir haben 3 Hauptrollen, die direkt an die Datenbanktabelle user : ROLE_USER , ROLE_MODERATOR und ROLE_ADMIN gebunden sind.

ABER, wir haben auch einige andere Rollen, die für die Crews -Komponente verwendet werden (siehe UML unten). Ich verwende die folgenden Rollen für Aktionen, die in Crew : ROLE_CREW_BOSS , ROLE_CREW_LEFTHAND , ROLE_CREW_RIGHTHAND , ROLE_CREW_MEMBER .

durchgeführt wurden %Vor%

Das ist die Basisstruktur, ich hoffe, dass dieser Teil klar ist. Jetzt kommt das Problem ...

Das Problem

Jeder Benutzer mit der Rolle ROLE_MODERATOR kann ForumTopic -Objekte erstellen, aber nicht den mit crew_id , da dieser für eine bestimmte Crew privat ist. Außerdem können nur Crewmitglieder (die auch Benutzer sind) mit der Rolle ROLE_CREW_BOSS , ROLE_CREW_LEFTHAND oder ROLE_CREW_RIGHTHAND die Forumsthemen ihrer Crew bearbeiten. Wie überprüfe ich diese Art von Komplexität? Mit einem Voter vielleicht?

UPDATE 1

Ich habe das Problem zu 50% gelöst, aber es ist nicht solide. Ich habe einen Wähler speziell für das Objekt Entity\ForumTopic erstellt.

%Vor%

Das einzige Problem hier ist, dass ich die entsprechenden Rollen nicht verwende, also kann ich zum Beispiel die Rollenhierarchie nicht benutzen. Hat jemand eine bessere Lösung oder eine Verbesserung meiner derzeitigen Lösung?

Danke!

Steffen

    
Steffen Brem 19.12.2013, 14:29
quelle

3 Antworten

3

Das Standard-Rollensystem von Symfony ist an den Benutzer gebunden. Ein Rollenfeld in Ihrer manyToMany-Tabelle crew_members ist unter diesem Gesichtspunkt nicht sinnvoll.

Was Sie wollen, ist autorisierungsbasiert für den Benutzer AND für die Crew , also sollten Sie wahrscheinlich die ACL-Funktionalität verwenden und die Rolle nur für globale Berechtigungen verwenden.

> %Vor%

(Sie können weitere Dokumente auf Ссылка einsehen. Sie können auch das ausgezeichnete Ссылка )

Sie kombinieren es mit einem Wähler:

%Vor%     
Guilro 28.12.2013, 13:50
quelle
0

Sie können die Lösung berühren! Sie müssen nur ein paar Dinge tun, wenn Sie die Rollen überprüfen wollen. Registrieren Sie zunächst Ihren Wähler als Dienst, um ihn mit dem Sicherheitskontext zu erstellen:

Fügen Sie dies in Ihrer Datei services.yml hinzu:

%Vor%

Nun müssen Sie einen Konstruktor definieren, um den securityContext zu erhalten und ihn in der Vote-Methode zu verwenden:

%Vor%

Nun, Sie haben einen Voter, Sie müssen ihn auf einem ForumTopic-Objekt aufrufen, anscheinend wissen Sie, wie Sie das tun, und es war nicht Ihr Problem, darf ich Ihnen trotzdem vorschlagen, sich die SecureParam-Annotation der bekannten Jms anzusehen / SicherheitsextraBundle. Hier ist eine Möglichkeit, es in Ihrer Controller-Aktion zu verwenden:

%Vor%

Ich hoffe, es hat dir geholfen!

Viel Glück!

Prost.

    
lenybernard 28.12.2013 13:41
quelle
0

Ich würde Symfony acl verwenden:

%Vor%     
shacharsol 23.12.2013 21:20
quelle

Tags und Links