【问题标题】:Symfony4/Twig - is_granted() only checks first role in an array of rolesSymfony4/Twig - is_granted() 只检查角色数组中的第一个角色
【发布时间】:2020-03-29 05:13:25
【问题描述】:

我在 Twig 中检查权限时遇到问题。
用户可以有多个角色,它们以字符串数组的形式存储在数据库中。某些角色无权访问个人资料视图。
当我创建一个角色允许查看配置文件但另一个角色不允许查看配置文件的用户时 - is_granted() 似乎只检查数组中的第一个角色并返回 false,即使第二个角色确实允许访问。

在模板中它看起来像这样:

{% if is_granted('ROLE_backend_USER_Profile') %}
    <li>
        <a href="{{ path('admin_profile') }}">Profile</a>
    </li>
{% endif %}

角色层次结构如下所示:

ROLE_BACKEND_ADMIN:
    - ROLE_BACKEND_USER
    - ROLE_backend_USER_Profile
    - ROLE_backend_Post_addPost
    ... etc. ...
ROLE_BACKEND_OTHERTYPEOF_ADMIN:
    - ROLE_backend_Home_index
    - ROLE_backend_typeof_list
    - ROLE_backend_typeof_edit
    ... etc. ...

如果我的用户同时具有这两个角色 - is_granted('ROLE_backend_USER_Profile') 返回 false,即使拥有其他角色应该允许他访问。

【问题讨论】:

  • symfony 中的角色可能很棘手,实际上非常棘手。使用分析器查看 security token 具有哪些角色,这些角色可能与您可能期望的用户角色非常不匹配。注销并重新登录可能会很好地改变安全令牌的角色。 (这有时与模拟用户相关且实用,它为安全令牌(而不是用户)提供了一个角色,该角色与框架通信,它是一个模拟和东西)。所以请检查分析器以查看安全令牌具有哪些角色(这是 is_granted('ROLE_...') 唯一相关的东西)
  • 我会试试这个并报告。

标签: php symfony twig


【解决方案1】:

这种行为是预期的。正如 Symfony 文档中所解释的(阅读 "Hierarchical Roles" 部分):

role_hierarchy 值是静态的 - 例如,您不能存储 数据库中的角色层次结构。如果你需要,创建一个自定义 在数据库中查找用户角色的安全投票者。

【讨论】:

  • 这根本不是我要做的。我想我写的不是很清楚。层次结构不存储在数据库中。 “用户”实体有一个字段 $roles 存储每个用户已被授予的角色(作为字符串数组)。这些只是像“ROLE_BACKEND_ADMIN”这样的顶级角色。
猜你喜欢
  • 1970-01-01
  • 2021-07-27
  • 2021-07-06
  • 2018-02-07
  • 2019-10-19
  • 2013-03-31
  • 1970-01-01
  • 2019-05-19
  • 2019-07-20
相关资源
最近更新 更多