2012-10-22 7 views
8

Ich benutze Symfony2 und ich habe Benutzer und Rollen bereits in meiner Datenbank gespeichert. Wenn ich in security.yml so etwas wie unten aufgeführt es funktioniert super:Wie speichert Symfony2 "access_control" Informationen in der Datenbank?

access_control: 
    - { path: ^/admin, role: ROLE_ADMIN} 
    - { path: ^/users, role: ROLE_MANAGER} 

Aber ich mag diese access_control Informationen in der Datenbank speichern, so dass der Benutzer von meinem System kann die Berechtigungen selbst unter Verwendung der Verwaltungsoberfläche ändern.

Ich sah ACL und FOSUserBundle, konnte aber keine Lösung dafür finden. Ich fand, dass ich Berechtigungen mit etwas wie if ($user->hasRole($role)) überprüfen konnte, aber ich würde dies in jedem Controller tun müssen.

Gibt es eine Möglichkeit, eine dynamische Funktion "access_control" zu definieren? Vielleicht etwas wie das Umleiten der access_control zu einer Klasse, die wahr oder falsch zurückgeben könnte. Irgendeine Lösung?

Antwort

5

Der beste Weg wäre, eine bestimmte Rolle einzurichten (z. B. DB_ROLE_CHECK), die Sie für Ihre Aktionen/Dienste festlegen, die für Ihre gespeicherten Rollen validiert werden sollen.

Dann würden Sie einen Sicherheits-Voter erstellen, der sich in DB_ROLE_CHECK einklinkt und Ihre Anfrage gegen Ihre Datenbankeinträge validiert.

See:

+0

Danke, es hat perfekt funktioniert! –

+0

Ich habe es nicht verstanden. Wo muss ich die Rolle DB_ROLE_CHECK in der Rollenhierarchie platzieren und wie überprüfe ich die Route in Voter? Zum Beispiel habe ich DB-Einträge wie [Route, Rollen]. Und in der access_control Regel^/: DB_ROLE_CHECK, richtig? So wird DBVoter bei jeder Anfrage ausgeführt. In $ Attribut habe ich Rolle, dann $ Token. Und ich werde dann eine Route oder einen Pfad als $ subject param haben? Also muss ich den DB-Record nach Pfad holen und seine Rolle mit $ user von $ token in einem DecisionManager verwenden, richtig? –

3

Die Landkarte ist here gebaut.

Wenn keine access_control gefunden wird, wird nichts unternommen.

Definieren Sie nun Ihre eigene Implementierung des AccessMapInterface und überschreiben Sie den Parameter security.access_map.class mit Ihrer Klasse.

Sie benötigen wahrscheinlich eine Fabrik, um Ihre AccessMap zu erstellen.

+1

Ich versuche es zu tun, aber bitte, wie kann ich den Parameter security.access_map.class überschreiben? Ich habe versucht, dies in security.yml: Sicherheit: access_map: Klasse: CRM \ CoreBundle \ Security \ DBAccessMap –

Verwandte Themen