我想知道:
1 - 如何从 SESSION
变量创建两个不同的中间件(用于 ADMIN
和 STAFF
)以便稍后使用它们以防止既不是管理员也不是工作人员的用户访问页面我不希望他们拥有访问权限???
这就是我所做的,但我完全不确定并陷入困境:
管理员
成员的功能处理访问:
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
和工作人员
。如何在页面中同时使用这两个函数来检查是否 用户是管理员或工作人员,因此阻止对以下用户的访问 既不是
ADMIN
也不是STAFF
???
谢谢你,请帮助我。
最佳答案
有很多方法可以实现这一点,但这里是一种。我会简化这些函数,以便它们每个都返回一个 bool 值。将所有重定向逻辑、注销内容移至调用代码中。
我不确定您使用的 session key 的名称,因此我只使用了 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
}
Thank you for your reply. But I'm confused by your answer. Actually, what I don't understand is why you didn't first declare the session variables $_SESSION['hlbank_admin_user'] and $_SESSION['staff_id'] returned in the isAdmin() functions and isStaff() because you just returned them with isset in each of those two functions ???
But why return them knowing that they have not yet declared???
为了消除任何困惑,通常的工作方式是在登录期间,您设置一些要在将来的请求中跟踪的 session 变量。您将来根本不需要重新声明它们。您可以简单地检查或阅读它们。
登录伪代码,
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
}
关于php - 在我的例子中,如何在 PHP 中阻止既不是管理员也不是工作人员的用户访问某些页面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70961935/