Bug Symfony2 isGranted('MY_ROLE') 返回 true,但防火墙返回 403


Bug Symfony2 isGranted('MY_ROLE') returns true but firewall returns 403

我在用户使用AuthenticationSuccessHandlerInterface侦听器登录后立即动态地向用户添加角色。

public function onAuthenticationSuccess(Request $request, TokenInterface $token)
{
    $user = $this->security->getToken()->getUser();
    $user->addRole('MY_ROLE');
    var_dump($this->security->isGranted('MY_ROLE'));
    var_dump($this->security->getToken()->getRoles()); die;
    return new RedirectResponse('...');
}

两个var_dump()都显示$user获得了新的权利。我制作了User类实现EquatableInterface类,并在其中制作了一个isEqualTo函数,以便在我更改用户数据时重新加载我的用户数据,而无需注销。

public function isEqualTo(UserInterface $user)
{
    return false;
}

但是,当我的侦听器重定向到达时,我在白页中得到了一个Access Denied,页面上没有分析器。

access_control:
    - { path: ^/login$, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/login/check$, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/register$, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/, roles: MY_ROLE }

我已经尝试在类中设置角色(在代码中不是动态的),它可以工作,所以我的防火墙似乎可以工作,除了动态设置数据,即使我重新加载用户也是如此。

知道那里出了什么问题吗?

您可以尝试将其添加到您的app/security.yml中:

security:
    always_authenticate_before_granting: true

我终于解决了这个问题,使用了一个带有security.interactive_loginkernel.request事件的事件侦听器。

我在会话中(在我为 security.interactive_login 事件注册的操作中)设置了一个密钥,如果该键设置为执行一件事或另一件事,则签入kernel.request事件(捕获对网站的每次调用)。

希望这可以帮助某人...