在PHP中,如何阻止既不是ADMIN也不是STAFF的用户访问某些页面



我想知道:

1-如何从SESSION变量创建两个不同的中间件(用于ADMINSTAFF(,以便稍后使用来防止既不是ADMIN也不是STAFF的用户访问我不希望他们访问的页面

以下是我所做的,但我完全不确定并陷入困境:

ADMIN成员的功能处理访问:

function checkAdmin()
{
$_SESSION['hlbank_admin_user'] = array('name' => 'Admin');
// if the session id is not set, redirect to login page
if (!isset($_SESSION['hlbank_admin_user'])) {
header('Location: ' . WEB_ROOT . 'admin/login.php');
exit;
}

// the user want to logout
if (isset($_GET['logout'])) {
doLogout();
}
}

STAFF成员的功能处理访问:

function checkStaff()
{
// if the session id is not set, redirect to login page
if(strlen($_SESSION['staff_id'])==0) {
$host = $_SERVER['HTTP_HOST'];
$uri  = rtrim(dirname($_SERVER['PHP_SELF']), '/\');
$extra= WEB_ROOT . "admin/pages_staff_index.php";
$_SESSION["staff_id"]="";
header("Location: http://$host$uri/$extra");
}

// the user want to logout
if (isset($_GET['logout'])) {
doLogout();
}
}
  • 所以请帮我纠正上面的两个函数,目的是通过SESSION检查连接的用户是否是ADMINSTAFF

  • 如何在页面中同时使用这两个函数来检查用户是ADMIN或STAFF,因此阻止访问既不是ADMIN也不是STAFF

谢谢你,请帮帮我。

有很多方法可以实现这一点,但这里有一种。我会简化这些函数,使它们每个都返回一个布尔值。将所有重定向逻辑、注销内容移动到调用代码中。

我不确定您使用的会话密钥的名称,所以我只使用了hlbank_admin_userstaff_id。我还假设,如果设置了它们,那么用户就是那个角色。

我将函数重命名为isAdminisStaff

function isAdmin(): bool
{
return isset($_SESSION['hlbank_admin_user']);
}
function isStaff(): bool
{
return isset($_SESSION['staff_id']);
}

然后,在您的呼叫代码中,您可以检查其中任何一个。

if (!isAdmin() && !isStaff()) {
// Not authorized >> redirect
}

更进一步,您可以创建一个函数来检查他们是管理员还是员工。

function isPrivileged(): bool
{
return isAdmin() || isStaff();
}

然后,在您的呼叫代码中,您可以检查该代码。

if (!isPrivileged()) {
// Not authorized >> redirect
}

感谢您的回复。但我对你的回答感到困惑。事实上我不明白的是你为什么不先宣布会议变量$_SESSION['hlbank_admin_user']和$_SESSION['staff_id']在isAdmin((函数和isStaff((中返回,因为您在这两个函数中的每一个函数中都返回了isset???

但是,既然他们还没有申报,为什么还要让他们回来呢???

为了消除任何混淆,通常情况下,在登录期间,您可以设置一些会话变量,以便在未来的请求中跟踪这些变量。你以后根本不需要重新申报。你可以简单地查看或阅读它们。

登录的伪代码,

session_start()

if (username & password = true) {
// These sessions values will persist for the entire session.
// Just make sure to call `session_start()` on every page before trying to access them
$_SESSION['isLoggedIn'] = true;
$_SESSION['role'] = admin;
}

然后,当他们试图访问受限页面时,你只需检查他们是否已登录并具有特定角色。

检查访问的伪代码,

session_start()
$loggedIn = $_SESSION['isLoggedIn'] ?? false;
$role = $_SESSION['role'] ?? '';
if ($isLoggedIn === true && $role === 'admin') {
// You are logged in and an admin
}

感谢您的回复。但我对你的回答感到困惑。实际上,我不明白的是,为什么你没有首先声明在isAdmin()函数和isStaff()中返回的会话变量$_SESSION['hlbank_admin_user']$_SESSION['staff_id'],因为你只是在这两个函数中的每一个函数中都返回了isset???

但是,既然他们还没有申报,为什么还要让他们回来呢???

相关内容

  • 没有找到相关文章

最新更新