PHP权限系统核心是“用户-角色-权限”三层关系,需通过users、roles、permissions三张主表及user_roles、role_permissions两张关联表实现;登录后将权限加载至$_SESSION['permissions'],并封装can()函数进行校验,且须在路由层、操作层、展示层多点校验。

PHP权限系统的核心是“用户-角色-权限”三层关系,判断时关键不在于写多少代码,而在于理清数据结构和验证时机。只要角色与权限的绑定关系明确、每次请求前完成校验,权限控制就自然成立。
设计角色与权限的数据结构
权限系统要可维护,数据库设计必须清晰。通常用三张表:
- users:存用户基础信息(id、username、password_hash等)
- roles:存角色(如 admin、editor、viewer)
- permissions:存具体权限(如 post.create、user.delete、setting.view)
- 再加两张关联表:user_roles(用户→角色)、role_permissions(角色→权限)
不建议把权限直接存在用户表里——角色变动时要批量更新用户,容易出错;也不建议用位运算或JSON字段存权限——查询和调试困难。
登录后加载用户权限到会话
用户登录成功后,立刻查出他所有权限标识(如数组 ['post.create', 'post.edit']),并存入 $_SESSION['permissions']:
立即学习“PHP免费学习笔记(深入)”;
// 示例:根据用户ID获取权限列表
$userId = $_SESSION['user_id'];
$permissions = $pdo->prepare("
SELECT DISTINCT p.code
FROM permissions p
JOIN role_permissions rp ON p.id = rp.permission_id
JOIN user_roles ur ON rp.role_id = ur.role_id
WHERE ur.user_id = ?
");
$permissions->execute([$userId]);
$_SESSION['permissions'] = array_column($permissions->fetchAll(), 'code');
登录后复制
后续所有权限判断都基于这个数组,避免重复查库。注意:每次用户角色变更后,需主动清除该用户的 session 或更新其权限缓存。
封装通用权限判断函数
在全局作用域或工具类中定义一个简洁的检查函数:
标签: php word js 前端 json 工具 session 后端 路由 作用域
还木有评论哦,快来抢沙发吧~