PHP基于角色+操作+频道的权限系统设计
角色
Role_id | 角色名 | |
1 | 编辑 | |
2 | 维护 |
用户
User_id | 用户名 |
1 | Lh |
2 | yl |
频道
Channel_id | 名称 |
1 | 产品 |
2 | 订单 |
操作
Action_id | Action_name | Channel_id |
1 | 添加产品 | 1 |
2 | 修改产品 | 1 |
3 | 审核订单 | 2 |
4 | 取消订单 | 2 |
5 | 查询订单 | 2 |
说明操作的action_id 可用这种设计方案:
用2的n次幂组成权限值的集合,如1、2、4、8、16…,某用户的权限值为其子集中的整数之和,如 7=1+2+4,5=1+4。如果要从数据库检索包含某几种权限的用户,则先把这几种权限值相加,假设和为k,然后select * from table where 1 and 用户权限值 = ‘k’;如果要判断某用户有哪些权限,则取出其权限值k,分别用k&1,K&2,K&4,k&16…,如果为真,则 表示有值等于“&”右边整数的权限,例如,如果k&4为真,则此用户有权限表中值等于4的权限; |
角色,用户,频道 关联表
Id | User_id | Role_id | Channel_id |
1 | 1 | 1 | 1 |
2 | 1 | 1 | 2 |
3 | 2 | 2 | 1 |
其中 ,频道和操作是固定的,用户,角色可以自行设计和添加,可实现角色不同,频道不同,权限不同。
如查询用户名为lh 有哪些权限,
Select action_id from 操作表 where Channel_id in ( select Channel_id from角色,用户,频道 关联表,角色表,用户表 where 用户表user_id =角色,用户,频道 关联表.user_id and 角色表.role_id = 角色,用户,频道 关联表.role_id) 这样可查询出 用户lh 所具有的所有操作 .再按照蓝色字体说明的 提取出 权限 ,进行权限的控制 。也可以把取得的 权限操作 放在$_SESSION容器里进行管理,免费每次操作都要进行数据库的操作。