PHP三级管理员权限通过“用户→角色→权限”分层模型实现,含系统级(level=1)、部门级(level=2)、操作级(level=3)角色,支持层级继承与数据范围隔离,并在后端动态校验作用域权限。

PHP平台实现三级管理员子用户权限,核心是采用“用户→角色→权限”分层模型,并支持角色嵌套或层级继承。所谓“三级”,通常指系统管理员(最高)、部门/模块管理员(中间)、普通操作员(最下),每级拥有不同范围的管理能力,比如上级可管理下级账号、分配权限,下级只能操作自己范围内的数据。
设计支持层级关系的角色表结构
传统RBAC只支持平级角色关联,要实现三级管理,需在角色表中增加字段标识层级和归属关系:
- 在roles表中添加level(tinyint,1=系统级,2=部门级,3=操作级)和parent_id(int,指向其上级角色ID,系统级设为0)
- users表不再直接存role_id,改用primary_role_id(主角色)+ 可选managed_by(上级管理员UID,用于审批流或数据可见性控制)
- 保留user_roles多对多表,允许用户拥有多个角色(如某人既是财务部管理员,又是报表查看员)
权限继承与范围隔离逻辑
三级权限不是简单叠加,而是要有继承规则和数据边界:
- 系统管理员能访问所有模块、所有数据、所有用户;可创建/停用二级角色、分配三级角色
- 部门管理员只能看到本部门用户、本部门数据(通过SQL WHERE子句动态加department_id = ?实现),且仅能分配本部门内三级角色
- 三级操作员默认无用户管理权,只能操作自己创建或被分配的数据行(行级权限),例如WHERE created_by = ? OR assigned_to = ?
- 权限检查函数can($permission, $scope = null)需支持传入作用域,如can('edit_user', 'dept_5')表示是否有编辑5号部门用户的权限
后端权限校验的关键实现点
每次请求进入控制器前,必须完成动态权限判定,不能只靠前端隐藏按钮:
- 登录后从数据库查出用户全部角色,递归向上获取父级角色及其权限(最多查3层,避免循环),合并去重后缓存到$_SESSION['scoped_permissions']
- 关键操作(如删除用户、导出报表)前调用校验:先判断是否具备基础权限(如delete_user),再验证作用域(如当前操作的用户是否属于当前管理员管辖部门)
- 敏感接口返回数据前做二次过滤,例如列表接口查询时自动追加AND department_id IN (SELECT dept_id FROM user_departments WHERE user_id = ?)
前端配合与体验优化
前端不参与权限决策,但需清晰呈现权限边界:
- 菜单栏根据scoped_permissions动态渲染,系统管理员看到“用户管理→角色配置”,部门管理员只看到“本部门成员”
- 操作按钮(如“批量启用”)在无对应权限时直接不渲染,而非禁用——防止用户F12修改HTML绕过
- 当用户尝试访问越权页面(如三级用户直接输入URL访问用户列表),后端应返回403并跳转至友好提示页,不暴露系统结构
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











