1

プロジェクトではとSonataUserBundleを使用しています。インストールパッケージは、次のとおりです。security.yml設定ファイル内のSonata Admin:isGranted()はAdminクラスでは常にtrueを返しますが、テンプレートでは真を返します

$ 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 

役割:

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

のみROLE_ADMINを持つユーザでログインして、私のUserAdminクラスから以下のダンプ:

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

symfonyツールバーで印刷(dev環境)

私は

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

app/Resources/SonataAdminBundle/views/CRUD/[anytemplate].html.twigのように上書きソナタテンプレートにダンプを置く場合は、正しい値が返されますが

true 
true 
true 

ここでこのラインは、 SonataUserBundleで、効果がなかったので、私はこれに入っ
false 
false 
true 

https://github.com/sonata-project/SonataUserBundle/blob/3.x/Admin/Model/UserAdmin.php#L95

isGranted()使用状況はここで説明されています。http://symfony.com/doc/current/bundles/SonataAdminBundle/reference/security.html#usage

私が何か間違ったことか、これはバグでアム?

編集:

@のmickadooさんのコメントのおかげで、私はそれが何を意味し、私はいつもtrueを返すように言われているデフォルトのハンドラsonata.admin.security.handler.noopを、持っていたことに気づきました。私はsonata.admin.security.handler.roleでそれを設定し、いくつかの役割(ROLE_SONATA_USER_ADMIN_USER_LISTROLE_SONATA_USER_ADMIN_USER_VIEW)を作成し、今では$this->isGranted('LIST')または$this->isGranted('VIEW')に正しい値を返しますが、常に$this->isGranted('ROLE_USER')または$this->isGranted('ROLE_ALLOWED_TO_SWITCH')ためfalse返します。

この役割を確認するにはどうすればよいですか?以下のような

+1

access_decision_strategyをここで述べたように満場一致に設定しましたか? http://symfony.com/doc/current/bundles/SonataAdminBundle/reference/security.html#id1 – mickadoo

+0

ありがとうございました!これはあまり変わっていませんでしたが、デフォルトのハンドラ 'sonata.admin.security.handler.noop'を使用していることに気付きました。私は質問を編集してより多くの情報を提供しました。 –

+0

それがあなたを助けてくれたことを嬉しく思います。私が言ったように、私はソナタで経験はありませんが、ドキュメントページで純粋に役割をチェックする用途はありません。あなたは '$ this-> get( 'security.authorization_checker') - > isGranted( 'ROLE_USER'))'を試しましたか?ユーザーにロールがあるかどうかを確認したい場合は、 'RoleHierarchy'を使ってサービスを作成して、到達可能なロールにチェックしたいロールが含まれているかどうかを確認できますが、これは最もクリーンな方法ではないかもしれません。あなたが 'AccessDecisionManager'有権者のどれがデバッグしてfalseを返すかを調べることができれば、それは役に立ちます。 – mickadoo

答えて

0

ジェネリック、非実体の役割ROLE_USERROLE_ADMINROLE_SUPER_ADMINROLE_{CUSTOM_STRING}デフォルトsymfonyのセキュリティコンテキストを使用してチェックする必要があります。

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

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

Twigテンプレートで:Adminクラスで

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

エンティティの行動の役割ようROLE_SONATA_USER_ADMIN_USER_LISTROLE_SONATA_USER_ADMIN_USER_VIEWROLE_{CUSTOM_SONATA_ADMIN_SERVICE_NAME}_{ACTION}はソナタ管理ヘルパーやsymfonyのセキュリティを使用して確認することができますコンテキスト。Twigテンプレートで

// 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 
} 

<!-- 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

Adminクラスで '$ securityContext = $ this-> getConfigurationPool() - > getContainer() - > get( 'security.context');'というエラーが発生しました: '存在しないサービスをリクエストしました"security.context"。 "アドバイスをお願いします – Mentos93

+0

Nevermind。私はそれを考え出した。 'security.context'はSymfony 2.5まで使用されます。 symfony 2.6以降、 'security.context'というサービスは廃止されました。代わりに' security.authorization_checker'を使う必要があります。このような; – Mentos93

+0

Adminクラスでauthorization_checkerを使用しようとすると、このエラーが発生します。「トークンストレージには認証トークンが含まれていません。考えられる理由の1つは、 "app/config/routing.yml"からインポートされている、このURL用のファイアウォールが設定されていない可能性がありますので、 "sonata_admin"タイプをサポートするローダーがあることを確認してください。トークンがNULLの場合、私は間違っていますか? – Laurentiu

0

は今のプロジェクトに取り組んでいますし、isGrantedは、管理クラスであることをやっているようだAdminクラスで

。私が見つけた 回避策は、管理クラスでこれです:

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

それはあなたのユーザー作成時に割り当てられている役割(継承なし)を返します。 もちろん、継承を考慮する必要があるため、許可するまたは許可しないすべての役割をリストする必要があります。 getUser()が空でないことを確認し、getRoles()が配列を返します。

関連する問題