我正在将SonataAdminBundle与Symfony 2.2一起使用,并希望根据用户的登录情况显示仪表板块。
e.g。
我阅读了整个文档,尤其是security doc,但未找到有关如何限制仪表板视图的信息。我已经实现了一个过滤器,如果用户的权限不够,它将在实体类的列表视图中不显示任何条目。
但是,根本不向他展示这些街区会更好。
有关如何执行此操作的任何想法?
答案 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 %}