2

Symfony 2.2 で SonataAdminBundle を使用しており、ログインしているユーザーに応じてダッシュボード ブロックを表示したいと考えています。

例えば

  • グループ Superadmin を持つユーザーには、ブロック 'UserManagement' と 'Messages' が表示されます。
  • グループ スタッフを持つユーザーには、ブロックの「メッセージ」のみが表示されます

ドキュメント全体、特にセキュリティドキュメントを読みましたが、ダッシュボード ビューを制限する方法に関する情報は見つかりませんでした。ユーザーの権限が十分でない場合、エンティティ クラスのリスト ビューにエントリを表示しないフィルターを既に実装しています。

しかし、彼にブロックをまったく見せない方がずっと良いでしょう.

これを行う方法についてのアイデアはありますか?

4

2 に答える 2

4

さて、これに遭遇した人のために、execute() で空の Response を返すだけで解決しました。私のユースケースは、特定の役割を持つユーザーにブロックを表示したい場合でした。最初に、security.context サービスを使用するためのサービスを次のように定義しました。

sonata.block.service.foo:
    class: Acme\DemoBundle\Block\FooBlockService
    arguments: [ "sonata.block.service.foo", "@templating", "@doctrine", "@security.context" ]
    tags:
      - { name: sonata.block }

次に、ブロック サービス __construct() を次のように定義しました。

//Acme\DemoBundle\Block\FooBlockService
public function __construct($name, EngineInterface $templating, $doctrine, $securityContext)
{
    parent::__construct($name, $templating);
    $this->doctrine = $doctrine;
    $this->securityContext = $securityContext;
}

最後に、実行機能で最初にしたことは、次のようにユーザーの特定のロールを確認することでした。

//Acme\DemoBundle\Block\FooBlockService
public function execute(BlockContextInterface $blockContext, Response $response = null)
{

    if( $this->securityContext->isGranted("ROLE_ACME_FOO") === false )
    {
        return new Response();
    }

    //... more code

これは機能しますが、ハックのように感じます。主に、ブロックはすべてのステージを通過し、出力でのみ何も返さないため、オーバーヘッドが発生します。より良い解決策は、何らかのカスタム コードに基づいて、ブロック全体が読み込まれないようにすることです。

結論として、これは最善の方法ではありませんが、私にとってはうまくいきました!

于 2014-02-24T18:06:19.067 に答える