2013-04-30 2 views
3

Я использую Sonata администратора Bundle и у меня возникают некоторые проблемы с функцией:Sonata Администратор Bundle удалить RouteCollection роли

function configureRoutes(RouteCollection $collection){ } 

Функция работает правильно, если я пишу простой:

$collection->remove('create'); 

Но что я triying сделать, это удалить некоторые маршруты в зависимости от роли пользователя, подключенного к, так что я пробовал:

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

Но зарегистрирован как Admin Я получаю сообщение об ошибке: Исключение было создано во время рендеринга шаблона («Маршрут» admin_sademer_core_MIENTITY_create «не существует».) В SonataAdminBundle: Block: block_admin_list.html.twig в строке 31.

Как будто в какой-то момент Соната удалит маршрут, создав я, прежде чем войти в панель инструментов, а затем, когда я войду в панель инструментов, я попытаюсь войти в создание маршрута, но маршрут уже удален. Но я не уверен, что происходит.

Любая идея? Большое спасибо!

+0

Посмотрите http://sonata-project.org/bundles/admin/master/doc/reference/security.html#configuration, есть на самом деле встроенный способ сделать это. – likeitlikeit

+0

Я видел эту страницу, но неясно, как прикреплять каждое разрешение каждому пользователю/роли с каждой сущностью. Поскольку в документации только показано, как вы можете объявлять разные разрешения, но не как объявлять, какое разрешение имеет каждую роль с каждым объектом. – Angel

ответ

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; 
    } 
} 
Смежные вопросы