PHP登录权限控制问题:修改当前用户权限后仍能访问受限页面
PHP登录权限控制问题:修改当前用户权限后仍能访问受限页面
嘿,我完全get到你的问题了——你做了个基于角色的登录系统,只有owner能访问employees.php,正常情况没问题,但当你修改当前登录用户自己的权限(比如把自己从owner改成其他角色),跳转回employees.php后居然还能进入这个受限页面,对吧?
问题根源
这事儿的核心原因很简单:你修改数据库里的用户权限后,Session中存储的function权限值并没有同步更新。现在的逻辑是用户登录时把权限信息存在Session里,之后页面的权限校验只认Session里的旧值,哪怕数据库里权限已经变了,Session里还是原来的owner,自然能通过校验。
解决方案
你需要在处理权限修改的代码里,针对当前登录用户的情况做两个关键操作:
- 如果修改的是当前用户自己,同步更新Session里的权限和用户信息;
- 如果修改后当前用户不再是
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
相关产品推荐
相关产品推荐

