6

我有一个应用程序,其中我有一个超级管理员角色和具有不同权限的各种用户角色。我希望能够使用http://symfony.com/doc/current/book/security.html#impersonating-a-user_switch_user上所示的查询冒充任何这些用户

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

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

4

1 回答 1

4

所以我又挖了一些,发现Listener我的自定义身份验证提供程序的类没有正确编写。它的编写方式Token是在每次页面加载时创建一个新的。

结果需要做两件事。

首先是将身份验证侦听器更改为类似于Symfony 防火墙侦听器中的侦听器,其一般结构如下所示。

if (null !== $token = $this->securityContext->getToken()) {
    if ($token instanceof UsernamePasswordToken && $token->isAuthenticated() &&
        $token->getUsername() === $username) {
            return;
    }
}

如果某些条件成立,这些侦听器基本上允许在不创建新令牌的情况下继续进行身份验证。这些条件是令牌是正确令牌的实例,它已经过身份验证,并且用户名与登录用户的用户名匹配。

其次,如果他尝试切换用户,则必须修改此代码以检查基于原始用户的身份验证。这个问题详细说明了其他人遇到的类似问题。解决方法是循环访问角色以查找SwitchUserRole并使用该数据进行身份验证。我已经复制了下面的补丁,它将在if上面的初始声明之后。

foreach ($token->getRoles() as $role) {
    if ($role instanceof SwitchUserRole) {
        $token = $role->getSource();
            break;
    }
}

一起,身份验证侦听器将仅在未通过某些条件时创建一个新令牌,并且冒充另一个用户的凭据将用于测试身份验证,而不是他们尝试冒充的用户的凭据。

于 2012-08-30T19:15:31.977 回答