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
.
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.
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
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%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.