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

PHP登录权限控制问题:修改当前用户权限后仍能访问受限页面

PHP登录权限控制问题:修改当前用户权限后仍能访问受限页面

嘿,我完全get到你的问题了——你做了个基于角色的登录系统,只有owner能访问employees.php,正常情况没问题,但当你修改当前登录用户自己的权限(比如把自己从owner改成其他角色),跳转回employees.php后居然还能进入这个受限页面,对吧?

问题根源

这事儿的核心原因很简单:你修改数据库里的用户权限后,Session中存储的function权限值并没有同步更新。现在的逻辑是用户登录时把权限信息存在Session里,之后页面的权限校验只认Session里的旧值,哪怕数据库里权限已经变了,Session里还是原来的owner,自然能通过校验。

解决方案

你需要在处理权限修改的代码里,针对当前登录用户的情况做两个关键操作:

  1. 如果修改的是当前用户自己,同步更新Session里的权限和用户信息;
  2. 如果修改后当前用户不再是owner,直接跳转到非权限页面(比如home.php),而不是还跳回employees.php。

来看具体怎么改你的代码:

原修改提交处理代码:

if(isset($_POST['change_submit'])){
    $firstname = $_POST['firstname'];
    $lastname = $_POST['lastname'];
    $email = $_POST['email'];
    $phone = $_POST['phone'];
    $adres = $_POST['adres'];
    $function = $_POST['function'];
    $active = $_POST['active'];
    $id = $_POST['id'];

    $adminusercontr = new AdminUserContr();
    $adminusercontr->changeAdminUser($firstname,$lastname,$email,$phone,$adres,$function,$active,$id);

    header("location: ../employees.php");
}

修改后的代码:

if(isset($_POST['change_submit'])){
    $firstname = $_POST['firstname'];
    $lastname = $_POST['lastname'];
    $email = $_POST['email'];
    $phone = $_POST['phone'];
    $adres = $_POST['adres'];
    $function = $_POST['function'];
    $active = $_POST['active'];
    $id = $_POST['id'];

    $adminusercontr = new AdminUserContr();
    $adminusercontr->changeAdminUser($firstname,$lastname,$email,$phone,$adres,$function,$active,$id);

    // 检查修改的是不是当前登录用户自己
    if(isset($_SESSION['id']) && $_SESSION['id'] == $id){
        // 同步更新Session里的用户信息
        $_SESSION['function'] = $function;
        $_SESSION['firstname'] = $firstname;
        $_SESSION['lastname'] = $lastname;

        // 如果修改后不再是owner,直接跳转到home.php
        if($function != 'owner'){
            header("location: ../home.php");
            exit(); // 一定要加exit,避免后续代码继续执行
        }
    }

    // 如果修改的是其他用户,或者自己还是owner,再跳回employees.php
    header("location: ../employees.php");
    exit();
}

另外给你提个小细节优化:在employees.php的权限校验部分,最好加上exit()或者die(),防止header跳转后页面还继续输出内容:

if(isset($_SESSION['id']) === false){
    header("location: index.php");
    exit(); // 新增
}

if($_SESSION['function'] != 'owner'){
    header("location: home.php");
    exit(); // 新增
}

这样修改后,当你把自己的权限从owner改成其他角色时,Session会同步更新,并且直接跳转到home.php,就不会再能访问employees.php啦。

备注:内容来源于stack exchange,提问作者royashoot

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 14:33:18