我在用户使用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_login
和kernel.request
事件的事件侦听器。
我在会话中(在我为 security.interactive_login
事件注册的操作中)设置了一个密钥,如果该键设置为执行一件事或另一件事,则签入kernel.request
事件(捕获对网站的每次调用)。
希望这可以帮助某人...