允许管理员以任何使用会话的用户身份登录

时间:2013-12-28 16:36:51

标签: php session

我有一个用户登录系统。我开始创建管理区域,并希望允许登录的管理员以任何用户身份登录(在新的浏览器窗口中)。我已经为每个设置了用户名/密码系统,并使用会话来存储一些数据。我想我一开始并没有想到这一点,因为现在我有点不知道如何解决这个问题。

成功登录后,我将信息存储在$_SESSION['account']中,并将此作为我的主要检查,如果他们已登录或未登录页面... if(!$_SESSION['account']){...send to login page...}

用户有一个会话,管理员有另一个会话。我做了这个,所以管理员和管理员作为用户登录将是分开的。如果我以管理员身份登录并以用户身份登录,则每个会话值都不会干扰....我可以退出管理员并以用户身份登录,反之亦然。

现在,我似乎无法弄清楚如何允许管理员以用户身份登录。我打算做一个下拉列表,选择一个用户名,然后以登录用户的身份打开一个新的浏览器窗口。由于我使用不同的会话,这是一个问题,但会话必须不同,所以他们不会干涉。

在任何想法之前,有人必须遇到这种情况吗?

admin:

// start the session and timer
session_name('Site_Admin');
session_set_cookie_params(0, '/', '.test.com', false, true);
session_start();

用户:

// start the session and timer
session_name('Site_Login');
session_set_cookie_params(0, '/', '.test.com', false, true);
session_start();

修改

我想到了更多,这是我提出的逻辑。我将不再使用两个会话,而是使用一个session_name('Site_Login');

当用户登录时,他们会在$_SESSION['user']中存储帐户信息(常用的姓名,姓名,用户名,电子邮件等)。另一方面,管理员将信息存储在$_SESSION['admin']中。用户和管理员可以访问网站的完全不同的区域,会话变量完全不同。

通过此设置,我可以像以前一样对每个页面进行检查以获得正确的访问权限:

if(!$_SESSION['user'])
{
    Header("Location: /"); //user login page
    exit;
}

or for admin pages

if(!$_SESSION['admin'])
{
    Header("Location: /admin/"); //admin login page
    exit;
}

此外,由于我现在使用相同的会话...如果我以管理员身份登录,我需要做的就是将$_SESSION['user']设置为我想在用户页面上以该用户身份登录的任何用户。在管理区域中,我可以执行下拉列表,为用户设置会话变量,并在用户区域中打开新页面。注销用户和注销管理员由unset($_SESSION['user']);unset($_SESSION['admin']);正确处理,而不是像以前那样销毁整个会话。

如果有人发现任何有这种逻辑的缺陷,请添加评论。

1 个答案:

答案 0 :(得分:2)

我也这样做,我使用与UNIX系统类似的策略:真实用户(真实用户登录)和有效用户(你是那个人)切换到)。然后根据上下文使用这两者中的任何一个。例如,您使用真实用户进行权限检查,使用有效用户将记录所有权附加到数据库等中。

初始化:

session_start();

$_SESSION['real_user'] = ... # check login credentials etc.
$_SESSION['effective_user'] = $_SESSION['real_user'];
$_SESSION['permission'] = ... # based on database: 'NORMAL', 'ADMIN', ...

用户开关

然后我有一个下拉列表,用于设置URL中的set_eff_user选项。它通过近似代码处理:

if ($_GET['set_eff_user']) {
    if (!can_switch_to_user($effective_user)) # permission checking; typically, 
                                              # you allow this to admin only
        die("error: ....");

    $_SESSION['effective_user'] = $effective_user;
}

注意:使用$_SESSION['permission']进行权限检查。