【问题标题】:Twig/Symfony2 : multiples roles with is_grantedTwig/Symfony2 : is_granted 的多重角色
【发布时间】:2013-06-12 13:29:50
【问题描述】:

我想知道用户是否具有“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')) }}

这是我在渲染时得到的:

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 的缓存。
我还尝试切换我的 User 的 getRoles() 方法返回的数组中角色的顺序:函数 is_granted 只会考虑数组的第一个角色

【问题讨论】:

    标签: symfony twig symfony-2.1


    【解决方案1】:

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

    改变

    'VIEW_GEOLOC_DATA' 
    

    'ROLE_VIEW_GEOLOC_DATA'
    

    当然,您需要在配置中进行更改并添加新角色。

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

    【讨论】:

    • 我没有使用 Role 类,这是我对 getRoles() 的定义:public function getRoles() { if($this->role == 100) return array('ROLE_SUPER_ADMIN', 'VIEW_GEOLOC_DATA'); } 但行为与Managing Roles in the Database相同
    • 尝试将其更改为使用“ROLE_”前缀。 Symfony 2 不喜欢没有前缀的角色。从文档中,“所有角色必须以 ROLE_ 前缀开头,才能由 Symfony2 管理。” symfony.com/doc/2.1/book/security.html 祝你好运,让我知道它是否有效。
    • @JonnyS:我遇到了与 OP 相同的问题。您是正确的,角色名称必须以 ROLE_ 开头。起初它仍然不起作用,但是当我注销然后重新登录时,is_granted 方法开始用于检查以 ROLE_ 开头的角色。
    • @DavidBaucum :我刚刚在 Symfony 2.4.2 下进行了测试,并且确实有效。但我很确定在 2.1 下它不会。
    【解决方案2】:

    我最终在 User 类中创建了一个新方法 hasRole

    public function hasRole($role)
    {
        return in_array($role, $this->getRoles());
    }
    

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

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

    编辑: 正如@JonnyS 所说,角色可能必须以ROLE_ 开头才能使用is_granted Symfony 的功能。未测试。

    【讨论】:

    • 为了清楚起见可能直接返回in_array的结果,而不是添加if/else:return in_array($role, $this->getRoles());
    • ROLE继承的is_granted帐户不是一回事,而仅仅检查用户是否具有指定的角色则不然
    【解决方案3】:

    创建一个安全选民来检查这一点。 http://symfony.com/doc/current/cookbook/security/voters_data_permission.html

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

    【讨论】:

      猜你喜欢
      • 2020-03-29
      • 1970-01-01
      • 2014-08-14
      • 2012-02-23
      • 2015-09-23
      • 2023-03-22
      • 2015-11-06
      • 1970-01-01
      • 2012-02-07
      相关资源
      最近更新 更多