【问题标题】:Symfony isGranted not working on Inherited Roles?Symfony isGranted 不在继承角色上工作?
【发布时间】:2017-03-04 04:52:02
【问题描述】:

我有一个继承角色为 PERM_USER_READ 的用户。

当我尝试调用 $this->isGranted('PERM_USER_READ'); 时,它总是返回 false。这是 isGranted() 的默认行为吗?如果是这样,我可以做些什么来评估我的 Twig 和 Controller 上的继承角色?

谢谢!

【问题讨论】:

  • 发布安全配置
  • 当然isGranted 适用于继承的角色。你肯定错过了其他东西。

标签: symfony


【解决方案1】:

尝试将您的角色重命名为 ROLE_PERM_USER_READ

【讨论】:

  • 嗨,显然这里的问题是 isGranted 不会评估除“ROLE_”以外的前缀。
  • 问题解决了吗?
  • 我所做的是创建自己的实用程序类来处理层次结构。我真的不知道这是最好的方法还是什么。
  • Symfony 允许您在 security.yml 文件中配置站点角色的层次结构。文档链接:symfony.com/doc/current/security.html#hierarchical-roles
【解决方案2】:

Symfony 4 答案:

我发现带有继承 ROLE 的 ROLE 非常混乱,因此我们采用了“一个 ROLE 为您提供 ALLOWS”的系统:

ROLE_PRODUCT_MANAGEMENT:
 - ALLOW_PRODUCT_EDIT
 - ALLOW_ASSORTMENT_READ

我们只检查 ALLOW_*“角色”,这让一切都减少了 100% 的混乱。 我们遇到了和你一样的问题。我已经通过创建一个执行以下操作的服务来解决这个问题:

// /vendor/symfony/security-core/Role/RoleHierarchyInterface.php
$reachableRoles = $this->roleHierarchy->getReachableRoleNames($user->getRoles());

// Check wether you have the required role, can you see this ENTITY in general?
if (!in_array('ALLOW_PRODUCT_EDIT', $reachableRoles, true)) {
    return false;
}

Symfony 5 答案:

不幸的是:目前还没有。来自 RoleHierachyInterface 的来源:

 * The getReachableRoles(Role[] $roles) method that returns an array of all reachable Role
 * objects is deprecated since Symfony 4.3.

我们目前正处于升级到 Sym5 的过程中,我们还没有达到这一点。如果有人对此有一个巧妙的解决方案,那就太好了。

【讨论】:

    【解决方案3】:

    角色必须ROLE_开头 正如documentation中所说的

    • 每个角色都必须以 ROLE_ 开头(否则,事情将无法按预期进行)

    • 除了上述规则,角色只是一个字符串,你可以发明你需要的东西(例如 ROLE_PRODUCT_ADMIN)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多