在phpmvc环境中切换用户登录


Shift users logins in php mvc environment

我试图完成一项可能相当简单的任务,但我在某个地方被卡住了。

我想实现的是:如果我以管理员身份登录,我可以选择以任何用户身份登录。在我以用户身份登录后,如果我想回到管理员,我需要注销该用户,我将被重定向到管理员。

我在试图回复管理员时遇到了问题。如果我通过管理员登录某些用户帐户,那么我会在登录函数中设置一个会话变量,说明管理员已经登录到该帐户。然后在注销时,我会检查是否设置了会话变量。如果已设置,则将管理员登录回其面板,如果未设置,则仅注销用户。

但它似乎不是那样工作的。。。当我注销时,我失去了一切。如果有人能帮我做这件事,我将不胜感激。如果有人想看一看,我也可以粘贴代码。

这是登录代码

if(isset($_POST['login']) || isset($adminInit)) {
    if(!isset($adminInit)) {
        // it is a regular user
        // clean POST input
        // return the user from the database
    }
    else {
        // it is the admin
        // return the user from the database
    }
    if(!empty(the database call)) {
        if(isset($adminInit)) {
            $this->session->adminID = $this->session->id;
        }
        $this->session->loggedIn = true;
        $this->session->id = $data['id'];
        $this->session->level = $data['user_level'];
        if($this->session->level == 9)
            header('location: ' . __SITE_URL . 'admin/');
        else
            header('location: ' . __SITE_URL);
    }
    else $printError;
}

这是退出代码

if(isset($adminInit)) {
    $this->session->id = $this->session->adminID;
    header('location: ' . __SITE_URL . 'authenticate/login/');
}
$this->session->destroy();
header('location: ' . __SITE_URL);

而不是在每次注销时执行session_destroy()。相反,您应该在会话中实现堆栈或一些类似的后进先出法结构,以保存帐户列表。

是的,你应该在会话中保留所有的帐户链,并且可以访问,因为以后你可能不仅需要"以用户身份查看帐户",还需要"以管理员身份"查看一些其他信息。

基本上,您需要实现的是在登录时推送新的用户详细信息(很可能是数组本身)。注销时弹出最后一个活动用户。。然后检查堆栈中的下一项是什么。如果堆栈为空,则完全注销(可能会破坏会话)。是否有一些帐户信息仍然存在-您将他/她重定向到适当的页面。

听起来像是丢失了会话数据-您要么丢失了会话id(由于域/路径设置而未设置或无效的cookie),要么某个地方隐藏了session_destroy()。