Entfernen Sie bestimmte Routen pro Benutzerrolle in Sonata ohne SonataUserBundle

8

Ich verwende SonataAdminBundle in Symfony 3. Da ich Symfony 3 verwende, kann ich SonataUserBundle immer noch nicht verwenden. Also verwende ich SonataAdminBundle nur mit FOSUserBundle.

Nun versuche ich, bestimmte Routen pro Rolle zu verbergen. Zum Beispiel habe ich nur drei Rollen:

  • Super Admin
  • Admin
  • Eine andere Rolle

Super Admin hat alle Rollen, die Admin hat, Admin hat alle die dritte, und die dritte hat offensichtlich ROLE_USER. Super Admin sollte in der Lage sein, neue Benutzer zu erstellen und ihm eine Rolle zuzuweisen. Der Super Admin sollte auch in der Lage sein, die Passwörter eines Benutzers zu ändern. Die Benutzer sollten die Kennwörter ihrer eigenen Konten ändern können. Und schließlich, andere Rollen, die Super Admin sollte nicht in der Lage sein, ihre eigenen Rollen zu ändern und neue Benutzer zu erstellen.

Wie kann ich dies ohne SonataUserBundle erreichen? Für das Entfernen von Routen habe ich etwas wie folgt versucht:

%Vor%

Aber ich denke, es gibt eine bessere Lösung. Ich bin mir der offiziellen Dokumentation über Sicherheit durchaus bewusst, aber ich bin es verwirrt das, bedeutet das, dass ich jede einzelne Rolle für alle verschiedenen Admins in meiner security.yml Datei fest codieren muss? Funktioniert das sogar ohne SonataUserBundle? Ich möchte keine zusätzlichen Datenbanktabellen für ACL hinzufügen.

Kann jemand bitte helfen und / oder ein gutes Beispiel geben? Ich werde es wirklich sehr schätzen.

    
Mentos93 25.10.2016, 20:26
quelle

3 Antworten

1

Dies ist, was ich bisher nur habe, dass Benutzer neue Benutzer nicht erstellen können und Benutzer nicht bearbeiten und löschen können. Das ist einfach lächerlich, jede einzelne Rolle zu spezifizieren, nur um die 2 oder 3 zu entfernen, die ich nicht will:

%Vor%

Hat jemand einen besseren Weg? Bitte?

    
Mentos93 28.10.2016 09:38
quelle
1

Sie können einen benutzerdefinierten User-Permission-Voter für Ihre User-Entity definieren, siehe hier .

> %Vor%

Dann erstellen Sie den Service

%Vor%

Seien Sie vorsichtig mit der Strategie Zugriffsentscheidung , I funktioniert möglicherweise nicht abhängig von Ihrer Konfiguration, wenn sie in unanimous oder consensus

definiert ist

Sie können auch eine direkte Verknüpfung / Route zur eigenen Bearbeitungsseite des Benutzers hinzufügen, wenn Sie nicht jedem Benutzer Zugriff auf die Benutzerliste gewähren möchten.

BEARBEITEN

Um die Benutzerrollenbearbeitung einzuschränken, können Sie einfach die Funktion configureFormFields bearbeiten:

, damit ein Benutzer seine eigene Rolle nicht bearbeiten kann %Vor%

Offensichtlich prüft die Symfony-Formularkomponente für Sie, dass kein anderes Feld hinzugefügt wird.

    
LFI 28.10.2016 12:34
quelle
1

So verwalten Sie Benutzer und Rollen in Sonata ohne SonataUserBundle ?

Antwort: wir müssen dasselbe tun wie SonataUserBundle . (Aber lassen Sie uns ein wenig vereinfachen)

Eine Analogie zur Sicherheit basierend auf ROLE_ in Symfony flat:

  • Das Haus: Ein Gebäude mit Türen und Schlüsseln (das System).
  • Die Tür: Platz im Haus, wo der Zugang eingeschränkt ist - isGranted() :

    %Vor%
  • Der Schlüssel: Berechtigung für den Zugriff auf eine eingeschränkte Tür erteilt - ROLE_* :

    %Vor%
  • Der Hauptschlüssel: Ein Schlüssel, der mehrere Türen öffnen kann:

    %Vor%

Nach dieser Analogie hat SonataAdminBundle bereits die Türen zur Beschränkung des Zugriffs auf jede Standardaktion erstellt ( zB list Aktion ) über eine verwaltete Entität.

Unsere Aufgabe besteht also darin, die Schlüssel den Benutzern "nur" zuzuweisen (es sei denn, Sie müssen Ihre eigenen Türen erstellen). Es gibt viele Möglichkeiten, dies zu archivieren (es hängt davon ab, was zu tun ist) ).

Hinweis: Wenn Sie keine Rollenhierarchie haben, haben Sie nur einzelne Schlüssel (d. h. Sie haben keine Hauptschlüssel), wodurch die Rollen (Schlüssel) weniger flexibel zugewiesen werden können.

Nun verwendet SonataAdminBundle eine bestimmte Methode, um die Schlüssel in einem Kontext der admin-Klasse zu überprüfen, indem Sie einfach folgendes tun: $admin->isGranted('list') , weil er seine eigene isGranted() -Funktion hat (wobei 'list' der ist aktionsname), aber wirklich, was es tut, ist den Namen der Rolle (mit dem aktuellen Admin-Code) zu erstellen, bevor Sie es überprüfen, so dass er dies schließlich überprüfen: isGranted('ROLE_APP_BUNDLE_ADMIN_FOO_ADMIN_LIST') -dieser Schlüssel ist es, was wir brauchen "geben" an den Benutzer.

Wie bekomme ich die Rollenliste von Sonata admin system?

In einem Controller-Kontext:

%Vor%

Als Nächstes können Sie alles damit machen (z. B. einen benutzerdefinierten Formulartyp zum Verwalten der Benutzerrolleneigenschaft erstellen). Sie könnten sortieren, gruppieren diese Rollen, um dem Benutzer diese Liste auf die einfachste Weise zu zeigen.

Hier oben können wir Rollen zuweisen und arbeiten, ohne auch role_hierarchy zu verwenden.

Weitere Details Ссылка

    
yceruto 26.10.2016 14:18
quelle