2013-06-12 18 views
6

Ich möchte wissen, ob ein Benutzer die "VIEW_GEOLOC_DATA" Rolle hat, aber ich habe ein Problem mit der Zweigfunktion is_granted().Twig/Symfony2: Multiples Rollen mit is_granted

Wenn ich in einer Vorlage verwenden:

Roles : {{ dump(app.user.getRoles()) }} 
is_granted('ROLE_SUPER_ADMIN') : {{ dump(is_granted('ROLE_SUPER_ADMIN')) }} 
is_granted('VIEW_GEOLOC_DATA') : {{ dump(is_granted('VIEW_GEOLOC_DATA')) }} 

Dies ist, was ich beim Rendern:

array(2) { 
    [0]=> 
    string(16) "ROLE_SUPER_ADMIN" 
    [1]=> 
    string(16) "VIEW_GEOLOC_DATA" 
} 
is_granted('ROLE_SUPER_ADMIN') : bool(true) 
is_granted('VIEW_GEOLOC_DATA') : bool(false) 

Ich habe versucht, in die und aus der Anmeldung, symfony-Cache zu leeren.
Ich habe auch versucht, die Reihenfolge der Rollen in der Anordnung durch die Methode GetRoles() meines Benutzerzurückschalten: die Funktion is_granted nur berücksichtigen die erste Rolle des Arrays

Antwort

8

Ich landete ein neues Verfahren zu schaffen hasRole in meiner User Klasse:

public function hasRole($role) 
{ 
    return in_array($role, $this->getRoles()); 
} 

Dann in einer Vorlage, die ich benutze:

{% if app.user.hasRole('ROLE_VIEW_GEOLOC_DATA') %} 
    {# do something #} 
{% endif %} 

EDIT: Wie @ JonnyS sagte, es ist möglich, dass Rollen mit ROLE_ beginnen müssen, um mitzu arbeiten 210 Symfonys Funktion. Nicht getestet.

+6

zur Klarheit vielleicht direkt das Ergebnis von in_array zurückgeben, anstatt ein if/else: 'return in_array ($ rolle, $ this-> getRoles());' –

+1

Es ist nicht das gleiche was is_granted Konten für ROLE Vererbung , während Sie nur überprüfen, ob der Benutzer eine bestimmte Rolle hat – Gamesh

8

Wenn Sie erwarten Symfony2 zu handhaben Ihre Rollen, dann müssen Ihre Rollen mit "ROLE_" beginnen.

ändern

'VIEW_GEOLOC_DATA' 

zu

'ROLE_VIEW_GEOLOC_DATA' 

Natürlich müssen Sie diese in der Config ändern und die neue Rolle hinzufügen.

Diese Antwort trifft nicht zu, wenn Sie eine dedizierte Rollenklasse verwenden.

+0

Ich bin kein Role-Klasse, das ist meine Definition von GetRoles(): 'public function GetRoles() { if ($ this-> Rolle == 100) return array ('ROLE_SUPER_ADMIN', 'VIEW_GEOLOC_DATA'); } ' Aber das Verhalten ist das gleiche wie [Verwalten von Rollen in der Datenbank] (http://symfony.com/doc/2.1/cookbook/security/entity_provider.html#managing-roles-in-the-database) –

+2

Versuchen Sie es zu ändern, um das Präfix 'ROLE_' zu verwenden. Symfony 2 mag keine Rollen ohne das Präfix. Aus den Dokumenten: "Alle Rollen müssen mit dem Präfix ROLE_ beginnen, das von Symfony2 verwaltet wird." http://symfony.com/doc/2.1/book/security.html Viel Glück und lass es mich wissen, wenn es funktioniert. – JonnyS

+0

Es ändert sich nichts –