树枝中 is_granted 的 Symfony 2 FOSUSER 问题

Symfony 2 FOSUSER issue with is_granted in twig

我在 twig 中遇到 is_granted('') 函数的问题。 我当前的用户具有以下角色:['ROLE_USER','ROLE_FOOBAR'],从 symfony 分析器检查。

使用此代码:打印管理员 link (KO):

{% if is_granted('ROLE_BACKOFFICE') or is_granted('ROLE_SYSTEM') %}
<li>
    <a href="{{ path('sonata_admin_dashboard') }}">
       ADMIN
    </a>
</li>
{% endif %}

使用此代码:不打印管理员 link(确定):

{% if app.user.hasRole('ROLE_BACKOFFICE') or  app.user.hasRole('ROLE_SYSTEM') %}
<li>
    <a href="{{ path('sonata_admin_dashboard') }}">
       ADMIN
    </a>
</li>
{% endif %}

我不明白为什么 link 印有 is_granted ? 我的角色层次结构似乎没问题,那段代码有什么问题?

如果您查看 vendor/friendsofsymfony/user-bundle/Model/User.php,它说明 hasRole 不得在此上下文中使用:

  /**
     * Never use this to check if this user has access to anything!
     *
     * Use the SecurityContext, or an implementation of AccessDecisionManager
     * instead, e.g.
     *
     *         $securityContext->isGranted('ROLE_USER');
     *
     * @param string $role
     *
     * @return boolean
     */
    public function hasRole($role)
    {
        return in_array(strtoupper($role), $this->getRoles(), true);
    }

这是 security.yml 中我的角色层次结构的片段:

role_hierarchy:
    ROLE_FOOBAR:         ROLE_USER
...
    ROLE_ADMIN:         [ROLE_USER, ROLE_MANAGER]

我终于找到问题了: 问题来自选民内部的错误。我更改了这个片段:

     if ($object != null && !$this->supportsClass(get_class($object))) {
         return self::ACCESS_ABSTAIN;
     }

至:

 if (!$this->supportsClass(get_class($object))) {
        return self::ACCESS_ABSTAIN;
    }

现在,一切都好起来了。刚刚失去了我的一天!希望对您有所帮助。