php - 在我的例子中,如何在 PHP 中阻止既不是管理员也不是工作人员的用户访问某些页面?

标签 php mysql security session middleware

我想知道:

1 - 如何从 SESSION 变量创建两个不同的中间件(用于 ADMINSTAFF)以便稍后使用它们以防止既不是管理员也不是工作人员的用户访问页面我不希望他们拥有访问权限???

这就是我所做的,但我完全不确定并​​陷入困境:

管理员成员的功能处理访问:

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_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
}

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/

相关文章:

javascript - 使用 jquery、ajax 和 codeigniter 的链选择器动态下拉框

php - 使用 PHP 和 MySQL 通过连接多个表来查询以获取多个数据

java - 以最高安全设置运行java

java.security.ProviderException : Could not initialize NSS

php membersite_config.php 页面内部服务器错误

php - 如何使用 php 在 Windows 命令提示符下编译 C 代码

php - 如何使用 NGINX 从 url 中删除 .php 和 .html 扩展名?

mysql - Google Cloud SQL 分片

mysql - 按来自不同表的字段对查询结果进行排序 (MySQL)

java - 基于自签名证书的身份验证