Twig/Symfony2:使用is_granted倍增角色

Lau*_* W. 6 symfony twig symfony-2.1

我想知道用户是否具有'VIEW_GEOLOC_DATA'角色,但是使用twig函数时遇到问题is_granted().

如果我在模板中使用:

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')) }}
Run Code Online (Sandbox Code Playgroud)

这是我在渲染时得到的:

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)
Run Code Online (Sandbox Code Playgroud)

我试图登录和退出,清空symfony的缓存.
我还试图切换我的用户getRoles()方法返回的数组中的角色顺序:函数is_granted只会考虑数组的第一个角色

Jon*_*nyS 9

如果您希望Symfony2能够处理您的角色,那么您的角色需要以"ROLE_"开头.

更改

'VIEW_GEOLOC_DATA' 
Run Code Online (Sandbox Code Playgroud)

'ROLE_VIEW_GEOLOC_DATA'
Run Code Online (Sandbox Code Playgroud)

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

如果您使用的是专用Role类,则此答案不适用.

  • 尝试将其更改为使用'ROLE_'前缀.Symfony 2不喜欢没有前缀的角色.从文档中,"所有角色必须以ROLE_前缀开头,由Symfony2管理." http://symfony.com/doc/2.1/book/security.html祝您好运,如果有效,请告诉我. (2认同)
  • @JonnyS:我遇到了和OP一样的问题.你是正确的角色名称必须以ROLE_开头.起初它仍然不起作用,但是当我退出然后返回时,is_granted方法开始工作以检查以ROLE_开头的角色. (2认同)

Lau*_* W. 8

我最终hasRole在我的User班级中创建了一个新方法:

public function hasRole($role)
{
    return in_array($role, $this->getRoles());
}
Run Code Online (Sandbox Code Playgroud)

然后,在模板中,我使用:

{% if app.user.hasRole('ROLE_VIEW_GEOLOC_DATA') %}
    {# do something #}
{% endif %}
Run Code Online (Sandbox Code Playgroud)

编辑: 正如@JonnyS所说,角色可能必须从ROLE_使用is_grantedSymfony的功能开始.没试过.

  • 为了清楚起见,可能直接返回in_array的结果,而不是添加if/else:`return in_array($ role,$ this-> getRoles());` (6认同)