检查Twig模板中的类范围ACL

时间:2014-09-16 16:32:45

标签: symfony twig acl

我正在建立一个小规模的symfony项目,就像我自己的启发一样。

我有一个Network类,它在Doctrine ORM设置中扩展了Entity,还有一堆用户(也是Doctrine设置中的实体)。我已经为一些用户提供了Network类的CREATE权限,这似乎正在起作用。至少我怀疑它会抛出异常:

    $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条目的用户也是如此类。

1 个答案:

答案 0 :(得分: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 %}

它按预期工作。