【问题标题】:How does symfony listen for the _switch_user?symfony 如何监听_switch_user?
【发布时间】:2012-08-23 10:48:33
【问题描述】:

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

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

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

【问题讨论】:

    标签: symfony


    【解决方案1】:

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

    如果身份验证侦听器未通过某些条件,并且冒充他人的用户将使用他们的凭据而不是他们尝试冒充的用户的凭据来测试身份验证,身份验证侦听器只会创建一个新令牌。

    【讨论】:

      猜你喜欢
      • 2016-02-09
      • 1970-01-01
      • 2019-04-29
      • 2016-10-16
      • 2015-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多