2013-06-12 87 views
1

我使用SonataAdminBundle與Symfony的2.2和要顯示的儀表盤塊取決於記錄哪些用戶SonataAdminBundle顯示儀表盤塊。根據用戶

例如

  • 用戶組超級管理員會看到塊「UserManagement」和「消息」
  • 用戶組成員只能看到塊「消息」

我閱讀整個文檔,尤其是security文檔,但沒有找到關於如何限制儀表板視圖的信息。如果用戶的權限不夠,我已經實現了一個過濾器,它將在實體類的列表視圖中不顯示任何條目。

但是,這將是更好的方式不顯示他個塊全部。

如何做到這一點任何想法?

+0

你已經有一個過濾器阻止列表視圖,但你根本不想展示它?請澄清:) – nifr

+0

是的,我有。 現在我不想在儀表板視圖中顯示任何塊。 目前它顯示在儀表盤上的塊,當我去到列表查看我的過濾器隱藏在某些用戶列表中的條目。 – cb0

回答

4

那麼,對於任何人運行到這個問題,我解決它通過返回一個空的響應中的execute()。我用例是一個地方,我想展現給用戶一個塊具有特定角色: 首先,我定義我的服務使用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被加載,基於一些自定義代碼。

總之,這是不是最好的方式,但它爲我工作!

+0

非常感謝!我會確定。試試看,如果它解決了我仍然在努力解決的問題。 – cb0

+0

不客氣。這是否最終解決了您的問題?我仍然在考慮其他方法,因爲這不是最乾淨的。 –

+0

在閱讀你的答案之前,我遇到了同樣的問題並以相同的方式解決,但這太可怕了。在我的面板保持它示出,因爲這我已經添加到塊中,例如列類的黑色空間''{位置:頂部,類型:my_block_name_service,類:COL-XS-8}''。這個''col-xs-8''弄亂了。 – Cassiano

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