【问题标题】:Bug Symfony2 isGranted('MY_ROLE') returns true but firewall returns 403错误 Symfony2 isGranted('MY_ROLE') 返回 true 但防火墙返回 403
【发布时间】:2016-04-19 23:40:28
【问题描述】:

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

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

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

【问题讨论】:

  • 重定向后您的角色将丢失。确保将其保存在数据库中。
  • 为什么要给用户添加角色,然后在令牌上调用getRoles()
  • @xabbuh 因为他想看看角色是否正确设置给了用户。
  • 你用的是什么版本的 symfony?
  • @Valdas 我在这个项目中没有使用数据库,我使用 API(另一个项目)获取我的用户数据,我只是希望角色在这个项目中是本地的。您的意思是我的用户数据会为每个操作重新加载吗? ://

标签: php symfony firewall roles access-control


【解决方案1】:

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

我在会话中(在我为security.interactive_login 事件注册的操作中)设置了一个键,并在kernel.request 事件中检查(捕获对网站的每个调用),如果该键被设置为做一件事或另一件事。

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

【讨论】:

    【解决方案2】:

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

    security:
        always_authenticate_before_granting: true
    

    【讨论】:

    • 我没有说我已经将它添加到我的 app/security.yml 中。无论如何感谢您的回答=)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-22
    • 1970-01-01
    • 2016-01-06
    相关资源
    最近更新 更多