Wie verwende ich den AccessDecisionManager in Symfony2 zur Autorisierung beliebiger Benutzer?

8

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:

  

Sie können den security.context-Dienst mit der isGranted-Methode verwenden. Sie können ein zweites Argument übergeben, das Ihr Objekt ist.

%Vor%

Ausgabe:

%Vor%

Meine Rollenhierarchie:

%Vor%

Meine UserInterface->getRoles() Methode:

%Vor%

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?

    
Adrian Günter 02.07.2012, 05:43
quelle

7 Antworten

1

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:

%Vor%

Dann habe ich eine hasRole() Methode definiert:

%Vor%

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 .

    
Adrian Günter 03.07.2012, 06:19
quelle
13

Sie benötigen hierfür nur AccessDecisionManager , es ist kein Sicherheitskontext erforderlich, da Sie keine Authentifizierung benötigen.

%Vor%

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.

>     
dr.scre 13.03.2014 13:53
quelle
3

Vielleicht können Sie eine neue securityContext-Instanz instanziieren und sie verwenden, um zu prüfen, ob der Benutzer berechtigt ist:

%Vor%     
Shady 11.06.2013 15:02
quelle
2
  

security.context ist seit 2.6 veraltet.

Verwenden Sie AuthorizationChecker :

%Vor%     
Marcelo Rodovalho 10.03.2016 02:13
quelle
0

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.

    
Abhijeet 03.01.2013 02:38
quelle
0

Erstellen Sie einen Service AccessDecisionMaker (verwendete Shady-Lösung)

%Vor%

Konfigurieren Sie dies als einen Dienst

%Vor%

Benutze es

%Vor%     
Venkat Kotra 30.11.2013 20:18
quelle
-3

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%     
Olivier Dolbeau 02.07.2012 07:01
quelle

Tags und Links