symfony如何监听_switch_user?

Squ*_*zic 5 symfony

我有一个应用程序,其中我有一个superadmin角色和具有不同权限的各种用户角色.我希望能够使用http://symfony.com/doc/current/book/security.html#impersonating-a-user上_switch_user显示的任何这些用户进行冒充.

但是,当我将查询添加到我的网址末尾时,它似乎没有做任何事情.我已经玩了很长时间了,似乎无法找到解决方案.我知道用户已登录ROLE_ALLOWED_TO_SWITCH,但我似乎无法弄清楚symfony是如何做到的.

我正在使用自定义身份验证提供程序,所以我认为它与此有关,但我不确定我需要关注什么.我可以发布所需的任何代码,但我真的不确定现在要发布什么.

Squ*_*zic 4

因此,我进行了更多研究,发现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)

总之,身份验证侦听器仅在未通过某些条件的情况下才会创建新令牌,并且模拟另一个用户的凭据将用于测试身份验证,而不是他们尝试模拟的用户的凭据。