2012-08-28 35 views
5

我有一个应用程序,我有superadmin角色和具有不同特权的各种用户角色。我希望能够模仿任何这些用户使用_switch_user查询如图所示http://symfony.com/doc/current/book/security.html#impersonating-a-usersymfony如何监听_switch_user?

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

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

回答

4

因此,我挖了一些,发现我的自定义身份验证提供程序的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; 
    } 
} 

一起,验证监听器将只创建一个新的令牌,如果它没有通过一定的条件下,谁是假冒其他将有用于测试认证而不是,他们是用户自己的凭据的用户试图冒充。