SonataAdminBundle根据用户显示仪表板块

时间:2013-06-12 10:44:18

标签: symfony sonata-admin symfony-2.2

我正在将SonataAdminBundle与Symfony 2.2一起使用,并希望根据用户的登录情况显示仪表板块。

e.g。

  • 拥有Group Superadmin的用户将看到“UserManagement”和“Messages”
  • 拥有群组工作人员的用户只会看到阻止“消息”

我阅读了整个文档,尤其是security doc,但未找到有关如何限制仪表板视图的信息。我已经实现了一个过滤器,如果用户的权限不够,它将在实体类的列表视图中不显示任何条目。

但是,根本不向他展示这些街区会更好。

有关如何执行此操作的任何想法?

2 个答案:

答案 0 :(得分: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

这很有效,但感觉就像是黑客。主要是因为Block经历了所有阶段,并且只在输出上它没有返回任何内容,这意味着开销。一个更好的解决方案是以某种方式阻止整个Block被加载,基于一些自定义代码。

总之,这不是最好的方法,但它对我有用!

答案 1 :(得分:1)

您可以使用角色限制对阻止的访问,如下所示:

sonata_admin:
dashboard:
    blocks:
        - { position: top, type: your_service_block_name, class: 'col-xs-4', roles: [ROLE_SOME_NAME_HERE_, ROLE_SOME_NAME_HERE_2] }

您可以在SonataAdminBundle:Core:dashboard.html.twig下查看此roles如何运作:

{% if block.roles|length == 0 or is_granted(block.roles) %}
<div class="{{ block.class }}">
    {{ sonata_block_render({ 'type': block.type, 'settings': block.settings}) }}
</div>{% endif %}