【捷哥浅谈PHP】第七弹 —- 基于角色的访问控制RBAC

2012 年 9 月 7 日5760

上文给大家讲解了使用循环输出九九乘法表,逻辑上还是相对简单一些,重在给大家提供一种看程序,解析代码的方法和思路,有什么意见或者建议可以跟帖批斗....

好了,不多说了,本文来给大家介绍一下“于角色的访问 ”,

说到权限,大家就很头疼,怎么样能灵活把好一个用户的权限,

有些同学会在用户表中加字段或者是在角色表中加相应的权限字段,

这样会有一个问题,做起权限来会感觉特别的蹩脚,而且很不灵活,每增加一种权限就要在数据库中增加一个字段,很不利于项目的迭代开发

那么我们就需要一种非常灵活的设计模式RBAC,即基于角色的访问控制;

我来给大家说下这种设计思想:

如果多个用户同时拥有同样的权限,那我们就需要给这些用户指定同一个用户角色,然后只需要通过角色来对操作的访问进行权限控制,

那我们表结构需要这样来设计,这个很重要,如下:

第一张数据表(用户表):

字段名称
字段说明

id
用户ID(主键自增)

username
用户名

password
用户密码

第二张数据表(角色表):

字段名称
字段说明

id
用户角色ID(主键自增)

name
用户角色名称

第三张数据表(节点表):

字段名称
字段说明

id
操作节点ID(主键自增)

name
操作节点的名称

zh_name
节点的中文说明

我们使用第三范式来设计关联表,这样做的好处是,避免数据冗余,并且对于一对多,多对一的关系都可以清晰的记录,条理清晰

第四张数据表(节点对应角色表):

字段名称
字段说明

role_id
用户角色ID(外键,关联角色表中的主键ID)

note_id
操作节点ID(外键,关联节点表中的主键ID)

第五张数据表(用户对应角色表):

字段名称
字段说明

role_id
用户角色ID(外键,关联角色表中的主键ID)

user_id
用户ID(外键,关联用户表中的主键ID)

通过这五张表就可以对权限进行访问控制,它的具体操作步骤如下:

用户输入用户名密码登录,
通过用户表判断,如果输入的用户名密码不合法,跳回重新登录
如果合法,在用户表中返回用户的ID号,
通过此用户ID号,到用户与角色的关联表中查询出用户的角色ID号,
拿到角色ID号,通过此ID号到角色与节点的关联表中查询出此角色拥有的节点访问权限,
将此权限节点全部存入SESSION中,当用户访问某一个模块的时候,

例如:http://www.lampbroher.net/index.php/stu/index

我们用session中的权限与$_GET['m']与$_GET['a']去对比,

如果$_GET['m']或者$_GET['a']在SESSION中不存在,说明该用户没有此权限,作出处理即可。

参考代码:

RBAC类文件:

初始化类:

这里给大家写了一个简单的RBAC类,仅供大家学习参考此思想,如有问题可以跟帖回复....

欢迎拍砖哈......

更多给力文章,请挪步:
【捷哥浅谈PHP】第一弹---php位运算符”|”和逻辑运算符”||”遇到的问题
【捷哥浅谈PHP】第二弹---经典算法的运用(冒泡排序和快速排序)
【捷哥浅谈PHP】第三弹---使用二分查找法查找数组中的元素位置
【捷哥浅谈PHP】第四弹---递归函数
【捷哥浅谈PHP】第五弹 --- 分页之九阳神功
【捷哥浅谈PHP】第六弹 ---- 使用for循环输出九九乘法表

0 0