我正在建立一个小规模的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条目的用户也是如此类。
答案 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 %}
它按预期工作。