Twig/Symfony2:授予多个角色

Twig/Symfony2:授予多个角色,symfony,twig,symfony-2.1,Symfony,Twig,Symfony 2.1,我想知道用户是否具有“查看地理位置数据”角色,但我在使用细枝函数is\u grated()时遇到问题 如果我在模板中使用: Roles : {{ dump(app.user.getRoles()) }} is_granted('ROLE_SUPER_ADMIN') : {{ dump(is_granted('ROLE_SUPER_ADMIN')) }} is_granted('VIEW_GEOLOC_DATA') : {{ dump(is_granted('VIEW_GEOLOC_DATA'))

我想知道用户是否具有“查看地理位置数据”角色,但我在使用细枝函数
is\u grated()
时遇到问题

如果我在模板中使用:

Roles : {{ dump(app.user.getRoles()) }}
is_granted('ROLE_SUPER_ADMIN') : {{ dump(is_granted('ROLE_SUPER_ADMIN')) }}
is_granted('VIEW_GEOLOC_DATA') : {{ dump(is_granted('VIEW_GEOLOC_DATA')) }}
这是渲染时得到的结果:

array(2) {
  [0]=>
  string(16) "ROLE_SUPER_ADMIN"
  [1]=>
  string(16) "VIEW_GEOLOC_DATA"
}
is_granted('ROLE_SUPER_ADMIN') : bool(true)
is_granted('VIEW_GEOLOC_DATA') : bool(false)
我尝试登录和注销,清空symfony的缓存。

我还尝试切换由我的用户的getRoles()方法返回的数组中角色的顺序:函数被授予将只考虑数组的第一个角色

如果您希望Symfony2处理您的角色,那么您的角色需要以“角色”开头

改变

'VIEW_GEOLOC_DATA' 

当然,您需要在配置中更改此设置并添加新角色


如果您使用的是专用角色类,则此答案不适用。

我最终在我的
用户
类中创建了一个新方法
hasRole

public function hasRole($role)
{
    return in_array($role, $this->getRoles());
}
然后,在模板中,我使用:

{% if app.user.hasRole('ROLE_VIEW_GEOLOC_DATA') %}
    {# do something #}
{% endif %}

编辑:
正如@JonnyS所说,可能角色必须从
ROLE\u开始,才能使用
Symfony的功能。未测试。

创建一个安全投票者来检查此问题。


这比在实体上为此创建一个方法要简单得多。

我没有使用角色类,这是我对getRoles()的定义:
公共函数getRoles(){if($This->Role==100)返回数组('Role\u SUPER\u ADMIN','VIEW\u GEOLOC\u DATA');}
但行为与尝试将其改为使用“Role\u”前缀相同。Symfony 2不喜欢没有前缀的角色。在文档中,“所有角色都必须以要由Symfony2管理的角色前缀开头。”祝你好运,让我知道它是否有效。@JonnyS:我遇到了与OP相同的问题。角色名称必须以角色前缀开头是正确的。起初它仍然不起作用,但当我注销然后重新登录时,is_grated方法开始工作,以检查以ROLE_uu开头的角色。@DavidBaucum:我刚刚在Symfony 2.4.2下进行了测试,它确实起作用。但是我很确定在2.1下它不会。为了清楚起见,可能直接返回in_数组的结果,而不是添加if/else:
returnin_数组($role,$this->getRoles())授予角色继承的帐户与只检查用户是否具有指定角色不同
{% if app.user.hasRole('ROLE_VIEW_GEOLOC_DATA') %}
    {# do something #}
{% endif %}