Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php ZF2以管理员身份切换用户会话_Php_Authentication_Zend Framework2 - Fatal编程技术网

Php ZF2以管理员身份切换用户会话

Php ZF2以管理员身份切换用户会话,php,authentication,zend-framework2,Php,Authentication,Zend Framework2,我有一个包含两个用户角色(成员和管理员)的应用程序。管理员可以看到所有用户的列表。现在,管理员应该可以像用户一样以另一个用户的身份登录以查看应用程序 在不失去管理员状态的情况下切换用户的最佳解决方案是什么 我已经为我的一些网络应用开发了这个解决方案,并且工作完美无瑕。让我们先假设一些事实: 将用户密码散列保存在数据库中 用户需要输入电子邮件和密码才能登录 我开发了一个AdminController,从中可以看到列表中的每个用户,在该控制器中有一个操作调用“LoginaAction”,它从URL接

我有一个包含两个用户角色(成员和管理员)的应用程序。管理员可以看到所有用户的列表。现在,管理员应该可以像用户一样以另一个用户的身份登录以查看应用程序


在不失去管理员状态的情况下切换用户的最佳解决方案是什么

我已经为我的一些网络应用开发了这个解决方案,并且工作完美无瑕。让我们先假设一些事实:

  • 将用户密码散列保存在数据库中
  • 用户需要输入电子邮件和密码才能登录
  • 我开发了一个AdminController,从中可以看到列表中的每个用户,在该控制器中有一个操作调用“LoginaAction”,它从URL接收一个参数(请阅读下面的代码):

    让我们看看登录操作的内容:

    //check if it comes form admin panel
    $params = $this->params()->fromQuery();
    if (isset($params['loginas'])) {
        $adminSession = new Container('adminData');
        if (isset($adminSession->userToLog)) {
            //let's use the destination user to log in as
            $user = $adminSession->userToLog;
            unset($adminSession->userToLog);
            //clear previous user session
            $session = new Container('appData');
            $session->getManager()->getStorage()->clear('appData');
            //log new user and redirect
            //userSession is a function that save the user data 
            //in my appData container session in the way I need it
            $this->userSession($user);
            //since I have loged in the user, we can redirect ourselves to home page
            return $this->redirect()->toRoute('home');
        }
    }
    
    现在,我们与登录用户有appData容器会话,与我们使用的“admin用户”有adminData容器会话

    我们如何回到我们的管理员用户

    我的登录操作可以从URL中读取一个名为“loguotas”的参数,在这种情况下,我们将检查adminData会话容器中是否保存了管理会话。在这种情况下,我们将清除当前的appData会话,并将在流程开始时保存的adminData用户(即我们的管理员用户)保存在该会话中

    //check if it is an admin user that want to return to view clients list
    if (isset($params['logoutas'])) {
        $adminSession = new Container('adminData');
        if (isset($adminSession->originalUser)) {
            $originalUser = $adminSession->originalUser;
            //clean sessions
            $session = new Container('appData');
            $session->getManager()->getStorage()->clear();
            //log in original user and redirect
            $this->userSession($originalUser);
            return $this->redirect()->toRoute('admin');
        }
    }
    

    这既不容易也不太复杂,但你需要坐下来思考几分钟。我希望这能很好地为您服务,或者至少为您的web应用提供一个起点。

    使用不同的帐户不是更好吗?不同的帐户意味着什么?
    //check if it is an admin user that want to return to view clients list
    if (isset($params['logoutas'])) {
        $adminSession = new Container('adminData');
        if (isset($adminSession->originalUser)) {
            $originalUser = $adminSession->originalUser;
            //clean sessions
            $session = new Container('appData');
            $session->getManager()->getStorage()->clear();
            //log in original user and redirect
            $this->userSession($originalUser);
            return $this->redirect()->toRoute('admin');
        }
    }