我在使用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 }
我已经尝试在类中设置角色(在代码中不是动态的),它的工作原理是我的防火墙似乎正常工作,除非动态设置数据,即使我重新加载用户。
有关那里出了什么问题的想法吗?
答案 0 :(得分:0)
您可以尝试在app / security.yml中添加:
security:
always_authenticate_before_granting: true
答案 1 :(得分:0)
我最后使用包含security.interactive_login
和kernel.request
事件的事件监听器来解决此问题。
我在会话中(在我为security.interactive_login
事件注册的操作中)设置了一个密钥并检查kernel.request
事件(捕获每个网站的呼叫),如果密钥设置为执行一项操作或其他
希望这可以帮助别人......