我有一个应用程序,其中我有一个superadmin角色和具有不同权限的各种用户角色.我希望能够使用http://symfony.com/doc/current/book/security.html#impersonating-a-user上_switch_user显示的任何这些用户进行冒充.
但是,当我将查询添加到我的网址末尾时,它似乎没有做任何事情.我已经玩了很长时间了,似乎无法找到解决方案.我知道用户已登录ROLE_ALLOWED_TO_SWITCH,但我似乎无法弄清楚symfony是如何做到的.
我正在使用自定义身份验证提供程序,所以我认为它与此有关,但我不确定我需要关注什么.我可以发布所需的任何代码,但我真的不确定现在要发布什么.
因此,我进行了更多研究,发现Listener我的自定义身份验证提供程序的类编写不正确。它的编写方式是Token在每次页面加载时创建一个新的。
因此需要做两件事。
第一个是将身份验证侦听器更改为类似于Symfony 防火墙侦听器中的侦听器,其一般结构如下所示。
if (null !== $token = $this->securityContext->getToken()) {
if ($token instanceof UsernamePasswordToken && $token->isAuthenticated() &&
$token->getUsername() === $username) {
return;
}
}
Run Code Online (Sandbox Code Playgroud)
如果满足某些条件,这些侦听器基本上允许身份验证继续进行,而无需创建新令牌。这些条件是令牌是正确令牌的实例、经过身份验证并且用户名与登录用户的用户名匹配。
其次,如果他尝试切换用户,则必须修改此代码以根据原始用户检查身份验证。这个问题详细介绍了其他人遇到的类似问题。解决方法是循环遍历角色以查找SwitchUserRole并使用该数据进行身份验证。我已经复制了下面的补丁,该补丁位于if上面的初始语句之后。
foreach ($token->getRoles() as $role) {
if ($role instanceof SwitchUserRole) {
$token = $role->getSource();
break;
}
}
Run Code Online (Sandbox Code Playgroud)
总之,身份验证侦听器仅在未通过某些条件的情况下才会创建新令牌,并且模拟另一个用户的凭据将用于测试身份验证,而不是他们尝试模拟的用户的凭据。