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

时间:2016-01-14 15:18:47

标签: php symfony firewall roles access-control

我在使用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 }

我已经尝试在类中设置角色(在代码中不是动态的),它的工作原理是我的防火墙似乎正常工作,除非动态设置数据,即使我重新加载用户。

有关那里出了什么问题的想法吗?

2 个答案:

答案 0 :(得分:0)

您可以尝试在app / security.yml中添加:

security:
    always_authenticate_before_granting: true

答案 1 :(得分:0)

我最后使用包含security.interactive_loginkernel.request事件的事件监听器来解决此问题。

我在会话中(在我为security.interactive_login事件注册的操作中)设置了一个密钥并检查kernel.request事件(捕获每个网站的呼叫),如果密钥设置为执行一项操作或其他

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