Ich möchte in der Lage sein zu überprüfen, ob Attribute (Rollen) einem beliebigen Objekt, das UserInterface
implementiert, in Symfony2 gewährt werden. Ist das möglich?
UserInterface->getRoles()
ist für meine Bedürfnisse nicht geeignet, weil es die Rollenhierarchie nicht berücksichtigt, und ich möchte das Rad in dieser Abteilung nicht neu erfinden. Deshalb würde ich gerne den Access Decision Manager verwenden, wenn möglich.
Danke.
Als Antwort auf Oliviers Lösung, hier ist meine Erfahrung:
%Vor%Sie können den security.context-Dienst mit der isGranted-Methode verwenden. Sie können ein zweites Argument übergeben, das Ihr Objekt ist.
Ausgabe:
%Vor%Meine Rollenhierarchie:
%Vor% Meine UserInterface->getRoles()
Methode:
ROLE_ADMIN
muss explizit zugewiesen werden, aber isGranted('ROLE_ADMIN', $user)
gibt TRUE
zurück, auch wenn der Benutzer gerade erstellt wurde und ihm keine anderen Rollen als die Standard ROLE_USER
, zugewiesen wurden, solange der aktuell geloggte Im Benutzer wird ROLE_ADMIN
gewährt. Dies führt zu der Annahme, dass das zweite Argument von isGranted()
ignoriert wird und stattdessen das Token
, das für AccessDecisionManager->decide()
von SecurityContext
bereitgestellt wird, verwendet wird.
Wenn das ein Fehler ist, werde ich einen Bericht einreichen, aber vielleicht mache ich noch etwas falsch?
RoleVoter
ignoriert das Objekt $, das von SecurityContext->isGranted()
übergeben wurde. Dies führt dazu, dass die RoleHierarchyVoter
Rollen aus dem Token
anstatt eines bereitgestellten UserInterface
$ Objekts (falls vorhanden) extrahiert, also musste ich eine andere Route finden.
Vielleicht gibt es einen besseren Weg, dies zu tun, und wenn es da wäre, würde ich es gerne wissen, aber das ist die Lösung, die ich mir ausgedacht habe:
Zuerst habe ich ContainerAwareInterface
in meiner Benutzerklasse implementiert, damit ich von dort aus auf die Sicherheitskomponente zugreifen konnte:
Dann habe ich eine hasRole()
Methode definiert:
Von einem Controller:
%Vor%Ausgabe:
%Vor% Obwohl es sich nicht um AccessDecisionManager
oder registrierte Wähler handelt (es sei denn, die getestete Instanz ist der aktuell authentifizierte Benutzer), reicht es für meine Bedürfnisse aus, da ich nur feststellen muss, ob ein bestimmter Benutzer eine bestimmte Rolle hat oder nicht .
Sie benötigen hierfür nur AccessDecisionManager
, es ist kein Sicherheitskontext erforderlich, da Sie keine Authentifizierung benötigen.
Dies berücksichtigt die Rollenhierarchie korrekt, da RoleHierarchyVoter
standardmäßig registriert ist
Aktualisieren
Wie von @redalaanait angemerkt, ist security.access.decision_manager ein privater Dienst, daher ist der direkte Zugriff darauf nicht gut. Es ist besser, das Service-Aliasing zu verwenden, mit dem Sie auf private Dienste zugreifen können.
>
security.context
ist seit 2.6 veraltet.
Verwenden Sie AuthorizationChecker
:
Das sieht nach einem Problem mit dem:
aus abstract class AbstractToken implements TokenInterface
Sehen Sie sich den Konstruktor an. Es sieht so aus, als ob Rollen bei der Instanziierung erstellt und zur Laufzeit nicht abgefragt werden.
%Vor%Daher können sich die Rollen nicht ändern, nachdem das Token erstellt wurde. Ich denke, die Option besteht darin, einen eigenen Wähler zu schreiben. Ich schaue mich immer noch um.
Erstellen Sie einen Service AccessDecisionMaker
(verwendete Shady-Lösung)
Konfigurieren Sie dies als einen Dienst
%Vor%Benutze es
%Vor% Sie können den Dienst security.context
mit der Methode isGranted
verwenden.
Sie können ein zweites Argument übergeben, das Ihr Objekt ist (siehe hier ).
In einem Controller:
%Vor%Tags und Links php symfony access-control