因此,我挖了一些,发现我的自定义身份验证提供程序的Listener
类未正确编写。它的写法是在每一次页面加载时创建一个新的Token
。
结果需要做两件事情。
第一个是将认证监听器更改为类似于Symfony Firewall Listeners中的认证监听器,其一般结构如下所示。
if (null !== $token = $this->securityContext->getToken()) {
if ($token instanceof UsernamePasswordToken && $token->isAuthenticated() &&
$token->getUsername() === $username) {
return;
}
}
这些听众基本上允许认证无需如果某些条件成立创建新令牌进行。这些条件是令牌是正确令牌的一个实例,它是已验证的,并且用户名与已登录用户的用户名相匹配。
其次,如果他尝试切换用户,则必须修改此代码以检查基于原始用户的身份验证。 This issue详细描述了其他人的类似问题。修复是通过角色循环找到SwitchUserRole
并使用该数据进行身份验证。我已经复制下面的补丁,这将在上面的初始if
声明之后。
foreach ($token->getRoles() as $role) {
if ($role instanceof SwitchUserRole) {
$token = $role->getSource();
break;
}
}
一起,验证监听器将只创建一个新的令牌,如果它没有通过一定的条件下,谁是假冒其他将有用于测试认证而不是,他们是用户自己的凭据的用户试图冒充。