多级管理员登录系统异常:Level2管理员显示Level1数据
嘿,我看到你的问题了,核心问题出在admin-pp-sipp-litbang.php里获取Session值的方式上,咱们一步步拆解:
问题根源:错误使用
isset()获取Session值 你在admin-pp-sipp-litbang.php里写了这两行代码:
$admin_level = isset($_SESSION['levelSession']); $admin_id = isset($_SESSION['adminSession']);
isset()函数的作用是判断变量是否存在,它返回的是布尔值(true/false),而不是Session里存储的实际数值!
举个例子:
- 当你用level2的管理员登录时,
$_SESSION['levelSession']的值是2,但isset($_SESSION['levelSession'])返回的是true,在SQL查询中布尔值true会被自动转换成整数1 - 同理,
$_SESSION['adminSession']是管理员的ID(比如2),isset()返回true也会被转成1
这就导致你的查询语句实际变成了:
SELECT * FROM admin WHERE id_admin=1 AND level=1
自然查到的就是level1管理员的信息了。
修正方案
1. 正确获取Session实际值,同时增加权限校验
在admin-pp-sipp-litbang.php开头,先校验用户是否有权限访问该页面,再直接取出Session里的真实值:
<?php session_start(); require_once 'class.admin.php'; // 先校验:必须是已登录的level2管理员,否则跳回登录页 if(!isset($_SESSION['adminSession']) || !isset($_SESSION['levelSession']) || $_SESSION['levelSession'] != 2){ header('Location: loginadmin.php'); exit; // 跳转后必须终止脚本执行 } $user = new ADMIN(); // 直接获取Session中的实际值 $admin_id = $_SESSION['adminSession']; $admin_level = $_SESSION['levelSession']; $stmt = $user->runQuery("SELECT * FROM admin WHERE id_admin=:admin_id AND level=:level"); $stmt->bindParam(":admin_id",$admin_id); $stmt->bindParam(":level",$admin_level); $stmt->execute(); $userRow=$stmt->fetch(PDO::FETCH_ASSOC); ?>
2. 额外优化建议
- 你的
cekSession()方法里跳转路径用了反斜杠\,建议改成正斜杠/,避免跨操作系统的路径问题:// 原代码 header('Location: \SIPP-Litbang\admin.php'); // 修改后 header('Location: /SIPP-Litbang/admin.php'); - 在
loginadmin.php的登录成功分支里,最好手动调用cekSession()并终止脚本,避免后续可能的代码执行问题:if ($admin->login($user, $pass)){ $admin->cekSession(); exit; }
内容的提问来源于stack exchange,提问作者beginnerrr
相关产品推荐
相关产品推荐

