我试图完成一项可能相当简单的任务,但我在某个地方被卡住了。
我想实现的是:如果我以管理员身份登录,我可以选择以任何用户身份登录。在我以用户身份登录后,如果我想回到管理员,我需要注销该用户,我将被重定向到管理员。
我在试图回复管理员时遇到了问题。如果我通过管理员登录某些用户帐户,那么我会在登录函数中设置一个会话变量,说明管理员已经登录到该帐户。然后在注销时,我会检查是否设置了会话变量。如果已设置,则将管理员登录回其面板,如果未设置,则仅注销用户。
但它似乎不是那样工作的。。。当我注销时,我失去了一切。如果有人能帮我做这件事,我将不胜感激。如果有人想看一看,我也可以粘贴代码。
这是登录代码
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()。