如何在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
相关产品推荐
相关产品推荐

