2014-09-16 4 views
2

Я создаю небольшой проект symfony, как и для собственного назидания, как и все остальное.Проверка класса ACL в шаблонах Twig

У меня есть класс сети, который расширяет Entity в настройке ORM доктрины и кучу пользователей (также сущности в настройке Doctrine). Я дал некоторым пользователям разрешение CREATE в классе Network, и это, кажется, работает. По крайней мере исключение, когда я ожидал:

$securityContext = $this->get('security.context'); 
    $objectId = new ObjectIdentity('class', 'Acme\\AcmeBundle\\Entity\\Network'); 
    if(false === $securityContext->isGranted('CREATE', $objectId)) { 
     throw new AccessDeniedException("You do not have permission."); 
    } 

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

 {% if is_granted('CREATE', 'Acme\\AcmeBundle\\Entity\\Network') %} 
     <li> 
      <a href="{{ path('network_new') }}"> 
       Create a new entry 
      </a> 
     </li> 
     {% endif %} 

Моя цель здесь это только шоу ссылка, если у пользователя есть разрешение на создание новой сети. Но вызов is_granted(), кажется, возвращает true для всех пользователей, а не только те, которые я явно предоставил CREATE, или, по крайней мере, ссылка всегда появляется даже для пользователей, у которых нет записей ACL/ACE для сети класс.

ответ

4

Получается, что is_granted() ожидает, что объект станет вторым параметром. Это расширение Twig, которое предоставляет функцию classId() для возврата объекта ObjectIdentifier.

class ClassIdExtension extends \Twig_Extension 
{ 
    public function getFunctions() 
    { 
     return array(
      'classId' => new \Twig_SimpleFunction('classId', array($this, 'classId')) 
     ); 
    } 

    public function classId($class) 
    { 
     return new ObjectIdentity('class', $class); 
    } 

    public function getName() 
    { 
     return 'acme_classidextension'; 
    }  
} 

После того, как он зарегистрирован в качестве службы в Symfony, вы можете использовать его в шаблонах Twig так:

{% if is_granted('CREATE', classId('Acme\\AcmeBundle\\Entity\\Network')) %} 
    <li> 
     <a href="{{ path('network_new') }}"> 
      Create a new entry 
     </a> 
    </li> 
{% endif %} 

И это работает, как ожидалось.

+0

Но действительно кажется, что должен быть лучший способ. – Michael

+0

Я не уверен, что это может помочь; но вы пробовали его с выражением в 'is_granted'? http://symfony.com/doc/current/book/security.html#complex-access-controls-with-expressions – Javad

+0

Я счастлив попробовать это, я просто не знаю, каково будет выражение на самом деле. – Michael