2016-05-24 12 views
1

Ich verwende und SonataUserBundle in einem Symfony Projekt. Die installierten Pakete sind:Sonata Admin: isGranted() gibt immer true in der Admin Klasse zurück, aber boolean in der Vorlage

$ composer show | grep symfony 
friendsofsymfony/rest-bundle    1.7.7    This Bundle provides various tools to rapidly develop RESTful API's with Symfony 
friendsofsymfony/user-bundle    v1.3.6    Symfony FOSUserBundle 
symfony/assetic-bundle     v2.8.0    Integrates Assetic into Symfony2 
symfony/css-selector      v2.8.6    Symfony CssSelector Component 
symfony/dom-crawler      v2.8.6    Symfony DomCrawler Component 
symfony/monolog-bundle     2.11.1    Symfony MonologBundle 
symfony/polyfill-apcu     v1.1.1    Symfony polyfill backporting apcu_* functions to lower PHP versions 
symfony/polyfill-mbstring    v1.1.1    Symfony polyfill for the Mbstring extension 
symfony/swiftmailer-bundle    v2.3.11   Symfony SwiftmailerBundle 
symfony/symfony       v2.7.13   The Symfony PHP framework 

$ composer show | grep sonata 
sonata-project/admin-bundle    2.3.10    Symfony SonataAdminBundle 
sonata-project/block-bundle    2.2.15    Symfony SonataBlockBundle 
sonata-project/cache      1.0.7    Cache library 
sonata-project/core-bundle    2.3.11    Symfony SonataCoreBundle 
sonata-project/doctrine-extensions  1.0.2    Doctrine2 behavioral extensions 
sonata-project/doctrine-orm-admin-bundle 2.3.4    Symfony Sonata/Integrate Doctrine ORM into the SonataAdminBundle 
sonata-project/easy-extends-bundle  2.1.10    Symfony SonataEasyExtendsBundle 
sonata-project/exporter     1.4.1    Lightweight Exporter library 
sonata-project/google-authenticator  1.0.2    Library to integrate Google Authenticator into a PHP project 
sonata-project/user-bundle    2.2.5    Symfony SonataUserBundle 

Die Rollen in der security.yml Konfigurationsdatei:

role_hierarchy: 
    ROLE_ADMIN:  [ROLE_USER, ROLE_SONATA_ADMIN] 
    ROLE_SUPER_ADMIN: [ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH] 

Angemeldete mit einem Benutzer, der ROLE_ADMIN nur hat die folgenden Deponien aus meiner UserAdmin Klasse:

dump($this->isGranted('ROLE_ALLOWED_TO_SWITCH')); 
dump($this->isGranted('ROLE_BLA_BLA_BLA')); 
dump($this->isGranted('ROLE_USER')); 

Drucken in Symfony Symbolleiste (dev Umgebung)

true 
true 
true 

Während, wenn ich die Deponien in einer außer Kraft gesetzt Sonata Vorlage wie app/Resources/SonataAdminBundle/views/CRUD/[anytemplate].html.twig setzen,

{{ dump(is_granted('ROLE_ALLOWED_TO_SWITCH')) }} 
{{ dump(is_granted('ROLE_BLA_BLA_BLA')) }} 
{{ dump(is_granted('ROLE_USER')) }} 

die richtigen Werte zurückgegeben werden.

false 
false 
true 

ich in diese bekam, weil diese Linie hier, in SonataUserBundle, keine Wirkung hatte: https://github.com/sonata-project/SonataUserBundle/blob/3.x/Admin/Model/UserAdmin.php#L95

Die isGranted() Nutzung hier beschrieben wird: http://symfony.com/doc/current/bundles/SonataAdminBundle/reference/security.html#usage

Bin ich etwas falsch zu machen oder ist das ein Bug ?

Edit:

Dank @ mickadoo Kommentar bemerkte ich, dass ich den Standard-Handler sonata.admin.security.handler.noop hatte, die immer gesagt wird, true zurückkehren, was immer das bedeutet. Ich stelle es mit sonata.admin.security.handler.role und erstellt einige Rollen (ROLE_SONATA_USER_ADMIN_USER_LIST und ROLE_SONATA_USER_ADMIN_USER_VIEW) und jetzt gibt es den richtigen Wert für $this->isGranted('LIST') oder $this->isGranted('VIEW'), aber immer wieder false für $this->isGranted('ROLE_USER') oder $this->isGranted('ROLE_ALLOWED_TO_SWITCH').

Wie kann ich diese Rollen überprüfen?

+1

Haben Sie Ihre access_decision_strategy einstimmig wie hier erwähnt eingestellt? http://symfony.com/doc/current/bundles/SonataAdminBundle/reference/security.html#id1 – mickadoo

+0

Vielen Dank! Es hat sich nicht viel verändert, aber half mir zu bemerken, dass ich den Standardhandler 'sonata.admin.security.handler.noop' ​​benutzte. Ich habe die Frage bearbeitet, um mehr Informationen zur Verfügung zu stellen. –

+0

Schön zu hören, dass es dir geholfen hat. Wie ich schon sagte, habe ich keine Erfahrung mit Sonaten, aber ich sehe keine Verwendung von reinen Rollen auf der Dokumentseite. Hast du es versucht? $ This -> get ('security.authorization_checker') -> isGranted ('ROLE_USER')) '? Wenn Sie nur überprüfen möchten, ob ein Benutzer eine Rolle hat, können Sie jederzeit einen Service mit der 'RoleHierarchy' erstellen, um zu prüfen, ob die erreichbaren Rollen die Rolle enthalten, die Sie überprüfen möchten, aber vielleicht ist dies nicht der sauberste Weg. Wenn Sie debuggen und überprüfen könnten, welcher der 'AccessDecisionManager'-Wähler falsch zurückgibt, könnte es helfen. – mickadoo

Antwort

0

generisch, nicht-Einheit Rollen, wie ROLE_USER, ROLE_ADMIN, ROLE_SUPER_ADMIN, ROLE_{CUSTOM_STRING} geprüft werden sollte den Standard Symfony Sicherheitskontext verwenden.

In der Admin Klasse:

$securityContext = $this->getConfigurationPool()->getContainer()->get('security.context'); 

if ($securityContext->isGranted('ROLE_USER')) { 
    // Your PHP code here 
} 

In Twig Vorlage:

{% if is_granted('ROLE_USER') %} 
    Your HTML/Twig content here. 
{% endif %} 

Entity Aktionen Rollen wie ROLE_SONATA_USER_ADMIN_USER_LIST, ROLE_SONATA_USER_ADMIN_USER_VIEW kann ROLE_{CUSTOM_SONATA_ADMIN_SERVICE_NAME}_{ACTION} die Sonate Admin Helfer oder die Symfony Sicherheit überprüft werden Kontext.

In der Admin Klasse:

// Using Symfony security context 
$securityContext = $this->getConfigurationPool()->getContainer()->get('security.context'); 

if ($securityContext->isGranted('ROLE_SONATA_USER_ADMIN_USER_LIST')) { 
    // your code here 
} 

// Using Sonata helper for shorter syntax 
if ($this->isGranted('LIST')) { 
    // your code here 
} 

In Twig Vorlage:

<!-- Using Symfony security context --> 
{% if is_granted('ROLE_SONATA_USER_ADMIN_USER_LIST') %} 
    Your HTML/Twig content here. 
{% endif %} 

<!-- Using Sonata helper --> 
{% if admin.isGranted('LIST') %} 
    Your HTML/Twig content here. 
{% endif %} 
+0

Mit '$ securityContext = $ this-> getConfigurationPool() -> getContainer() -> get ('security.context');' In einer Admin-Klasse erhalte ich einen Fehler: 'Sie haben einen nicht existierenden Dienst angefordert "security.context" .' Bitte geben Sie – Mentos93

+0

an. Ich habe es herausgefunden. 'security.context' wird bis Symfony 2.5 verwendet. Seit Symfony 2.6 ist der Dienst 'security.context' entzogen, und wir müssen stattdessen' security.authorization_checker' verwenden. So was; '$ securityContext = $ this-> getConfigurationPool() -> getContainer() -> get ('security.authorization_checker');' – Mentos93

+0

Ich erhalte diesen Fehler, wenn ich authorization_checker in einer Admin-Klasse verwende "Der Token-Speicher enthält kein Authentifizierungstoken. Ein möglicher Grund kann sein, dass für diese URL keine Firewall konfiguriert ist (die aus "app/config/routing.yml" importiert wird). Stellen Sie sicher, dass ein Loader den Typ "sonata_admin" unterstützt. " und das Token ist NULL, was mache ich falsch? – Laurentiu

0

Am an einem Projekt arbeitet jetzt und es scheint isGranted in Admin-Klassen, die tut. Behelfslösung I ist dies in der Admin-Klasse gefunden:

if ($this->getContainer()->get('security.token_storage')->getToken()->getUser()->getRoles()[0] == 'ROLE_EMPLOYEE') {} 

Es gibt die Rollen (ohne Vererbung) Sie bei der Benutzererstellung zugewiesen haben. Sie müssen natürlich für die Vererbung sorgen, also müssen Sie alle Rollen auflisten, die Sie erlauben oder verbieten wollen, je nachdem, was weniger aufzulisten ist. Überprüfen Sie getUser() ist nicht leer und getRoles() gibt ein Array zurück.