2013-04-30 75 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; 
    } 
} 
相关问题