Symfony2:如何根据权限隐藏Twig中的链接

时间:2013-06-13 10:48:01

标签: security symfony twig

我的应用程序显示了一个项目列表,项目详细信息页面和用于编辑这些项目的表单。这些是路线:

  • / - 项目清单
  • / project / 42 - 查看项目(项目详细信息页面)
  • / project / 42 / edit - 编辑项目

只有其所有者可以编辑项目。

我已经实施了一个选民,以防止对非所有者访问/ project / 42 / edit。

现在,我还想隐藏项目详细信息页面中的“编辑项目”链接。这样做的方法是什么?理想情况下,在Twig中,我想做类似

的事情
{% if may_access(path('project_edit', { 'id': project.id })) %}
  <a href="{{ path('project_edit', { 'id': project.id }) }}">edit project</a>
{% endif %}

我可以将此功能实现为Twig扩展,但可能已经存在类似的功能。

1 个答案:

答案 0 :(得分:11)

函数is_granted()实际上has a second parameter允许我做我需要的事情:

{% if is_granted("MAY_EDIT", project) %}
  <a href="{{ path('project_edit', { 'id': project.id }) }}">edit project</a>
{% endif %}

我结合检查控制器动作使用它:

public function editAction(Project $project)
{
    if (!$this->get('security.context')->isGranted('MAY_EDIT', $project)) {
        $this->flash('You are not allowed to edit this project');
        return $this->show($project);
    }
    // ...
}

这实际上与nifr在回答Sonata User - Security on custom field时使用的方法非常相似。我希望找到一种方法让自动调用选民并避免调用isGranted()。

如果你想看一下完整的代码,那就是我有published in github的教程项目。