2013-04-30 76 views
3

我使用的是管理員奏鳴曲捆綁,我有一些麻煩與功能:索納塔管理員集中刪除routeCollection角色

function configureRoutes(RouteCollection $collection){ } 

的功能才能正常工作,如果我寫一個簡單的:

$collection->remove('create'); 

但是我正在試圖做的是根據用戶連接角色刪除一些路由,所以我嘗試了:

$seguridad = $this->getConfigurationPool()->getContainer()->get('security.context'); 
if ($seguridad->getToken()->getUser() != "anon."){ 
    if (!$seguridad->isGranted('ROLE_ADMIN') ) { 
     $collection->remove('create'); 
    } 
} 

但是以管理員身份登錄我收到錯誤: SonataAdminBundle:Block:block_admin_list.html.twig在第31行渲染模板期間拋出異常(「路由」admin_sademer_core_MIENTITY_create「不存在。」)。

就像在某些時刻,Sonata會在進入儀表板之後刪除創建的路線,然後當我進入儀表板時,我會嘗試進入路線創建但路線已被刪除。但我不確定發生了什麼事。

有什麼想法?非常感謝!

+0

看看http://sonata-project.org/bundles/admin/master/doc/reference/security.html#configuration,實際上有一個內置的方法來做到這一點。 – likeitlikeit 2013-04-30 16:38:09

+0

我看到了此頁面,但不清楚如何將每個權限附加到每個實體的每個用戶/角色。 由於文檔僅顯示如何聲明不同的權限,而不是如何聲明哪個權限對每個實體都具有每個角色。 – Angel 2013-05-02 07:52:02

回答

0

這可能是因爲您的路線是緩存,試試這個:

$seguridad = $this->getConfigurationPool()->getContainer()->get('security.context'); 
if ($seguridad->getToken()->getUser() != "anon."){ 
    if (!$seguridad->isGranted('ROLE_ADMIN') ) { 
     $collection->remove('create'); 
    } else { 
     $collection->add('create'); 
    } 
} 
0

我只是做了不同的方式,就像覆蓋isGranted()在entitAdmin.php文件。然後,您可以根據用戶角色檢查權限。但它符合我們的目的。如果我們想要使用$ collection-> remove('create'),我們不能這樣做,因爲在應用程序運行時無法調用方法(「configureRoutes()」)。只有在創建緩存時調用該方法(「configureRoutes()」))。

/** 
* {@inheritdoc} 
*/ 
public function isGranted($name, $object = null) 
{ 
    $user = $this->getConfigurationPool()->getContainer()->get('security.context')->getToken()->getUser(); 

    switch ($name) { 
     case "CREATE": 
      if (!$user->hasRole("ROLE_ADMIN")) { 
       return false; 
      } 
     default: 
      return true; 
    } 
} 
相關問題