You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PHP登录会话中集成用户权限等级以控制内容展示

整合用户角色到会话并实现权限控制的方案

一、修改登录逻辑,获取并存储用户类型

首先调整登录时的数据库查询,同时取出用户密码与角色字段,验证通过后将角色存入会话和Cookie(若勾选"记住我"):

替换原登录逻辑中的查询与后续代码:

//get data in variables
$emailAddress = mysqli_real_escape_string($conn,$_POST['emailAddress']);
$password = mysqli_real_escape_string($conn,$_POST['password']);
$remember = isset($_POST['rememberMe']);

if(!filter_var($emailAddress, FILTER_VALIDATE_EMAIL)) {
     $error = 'Please enter a valid email address.';
}
elseif(email_exists($emailAddress,$conn)) { // if email address exists
    // 修改查询语句,同时获取密码与用户类型
    $result = mysqli_query($conn,"SELECT password, usrUserTypeNo FROM users WHERE email = '$emailAddress'");
    $userData = mysqli_fetch_assoc($result);
    if(!password_verify($password,$userData['password'])) // if password does not match
    {
        $error = 'Password is incorrect.';
    } else { // if password correct, log user in
        $_SESSION['email'] = $emailAddress;
        // 新增:将用户类型存入会话
        $_SESSION['user_type'] = $userData['usrUserTypeNo'];
        
        if($remember == 'on') { // if "keep user logged in" was ticked
            setcookie("email",$emailAddress,time()+7200); // keep user logged in for 2 hours
            // 新增:将用户类型存入Cookie
            setcookie("user_type",$userData['usrUserTypeNo'],time()+7200);
        }
        header("location: dashboard.php");
        exit; // 跳转后终止脚本执行,避免后续代码运行
    }
} else { // if email does not exist
    $error = 'Email address not registered.';
}

二、更新logged_in()函数,同步Cookie中的角色到会话

当用户通过Cookie自动登录时,需要将Cookie里的角色信息同步到会话,保证权限判断的一致性:

function logged_in(){
    if(isset($_SESSION['email'])) {
        return true;
    } elseif(isset($_COOKIE['email']) && isset($_COOKIE['user_type'])) {
        // 从Cookie恢复会话信息
        $_SESSION['email'] = $_COOKIE['email'];
        $_SESSION['user_type'] = $_COOKIE['user_type'];
        return true;
    } else {
        return false;
    }
}

三、封装角色判断函数(可选但推荐)

封装专用函数简化权限判断,让代码更易维护:

// 判断是否为管理员
function is_admin(){
    return isset($_SESSION['user_type']) && $_SESSION['user_type'] === '1';
}

// 判断是否为普通用户
function is_normal_user(){
    return isset($_SESSION['user_type']) && $_SESSION['user_type'] === '3';
}

四、在受限页面控制内容展示

在dashboard.php等页面,登录验证通过后即可根据角色展示对应内容:

if(logged_in()) { // if user logged in, show page
    // 管理员专属内容
    if(is_admin()){
        echo '<h2>管理员面板</h2>';
        echo '<ul>
                <li>用户管理</li>
                <li>系统设置</li>
              </ul>';
    }
    
    // 普通用户专属内容
    if(is_normal_user()){
        echo '<h2>用户中心</h2>';
        echo '<ul>
                <li>个人信息修改</li>
                <li>我的订单</li>
              </ul>';
    }
} else {
    header("location: login.php");
    exit;
}

注意事项

  • 若数据库中usrUserTypeNo为数值类型,判断时去掉引号即可(如$_SESSION['user_type'] === 1)。
  • 敏感操作(如管理员的删除、修改权限)必须在后端再次验证角色,不能仅依赖前端隐藏。
  • 可对Cookie中的用户类型进行简单加密(如base64_encode),读取时解密,降低被篡改风险。

内容的提问来源于stack exchange,提问作者Adey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 01:58:15