我想知道:
1-如何从SESSION
变量创建两个不同的中间件(用于ADMIN
和STAFF
(,以便稍后使用来防止既不是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
检查连接的用户是否是ADMIN
和STAFF
。如何在页面中同时使用这两个函数来检查用户是ADMIN或STAFF,因此阻止访问既不是
ADMIN
也不是STAFF
谢谢你,请帮帮我。
有很多方法可以实现这一点,但这里有一种。我会简化这些函数,使它们每个都返回一个布尔值。将所有重定向逻辑、注销内容移动到调用代码中。
我不确定您使用的会话密钥的名称,所以我只使用了hlbank_admin_user
和staff_id
。我还假设,如果设置了它们,那么用户就是那个角色。
我将函数重命名为isAdmin
和isStaff
。
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
???
但是,既然他们还没有申报,为什么还要让他们回来呢???