thinkPHP学习3-thinkPHP RBAC

thinkPHP带了一个扩展的RBAC模型,模型和think一样的奇葩,不走寻常路,但凡学习过其他框架童鞋,都会被绕晕倒的,PHP的debug不太会用,导致thinkPHP常常出现不显示内容,也没有错误提示,用记事本编辑的童鞋真的勇气可嘉啊,可惜Eclipse老是提示thinkPHP到处是错误,无法编辑,只有回到sublime text2;

废话好多!

1,thinkPHP RBAC最难的是 数据库的理解,一旦理解了数据库,其他的就容易了

他用了五张表来表示RBAC模型,其实就是经典的W模型:

图:经典RBAC的W模型

thinkPHP学习3-thinkPHP RBAC_第1张图片

用户user与角色role通过映射表user_role关联,角色role与权限permission通过映射表role_permission关联,就是RBAC最简易模型,基于角色的权限模型,要是thinkPHP给出这样一个数据库表,那好多童鞋都要少走很多弯路了,可惜thinkPHP给出了一个另外命名的表:

图:thinkPHP的RBAC模型

thinkPHP学习3-thinkPHP RBAC_第2张图片

和上面的经典图对比,就能看出其实也是一个W模型,只是名字变换了一下,但是奇葩就在于,他的node表不易理解,其中打钩的地方,是最难理解的,id就是权限的ID,PID就是这个权限的父亲的ID,level是这个权限的数组等级,通过RBAC里面的方法,RBAC::getAccessList可以获得登陆user的全部权限,这个权限是一个array表,level就是array里面处于哪个数组级别里面,这个NODE表在分配权限的时候,有一定的内置规律:

1,首先需要的权限是整个项目的权限,例如项目是App,那么第一个权限就是:

id=1,name=App,pid=0(项目没有父亲ID),level=1

2,其次需要的权限是模块的权限,例如Index模块的权限,就是IndexAction.class.php文件的访问权限:

id=2,name=Index,pid=1(Index的父亲ID就是项目App),level=2(处于数组第二层)

3,再来是模块下的方法权限,例如Index模块下有一个add方法:

id=3,name=add,pid=2,level=3

这样设置后,加入用户拥有这个权限,那么通过RBAC::getAccessList可以获得这样一个数组

array(
   'app'=>array(//level在第一层,所以level必须设置
        'Index'=>2 array(
               'add'=>3
        )  
   )
)

这样似乎权限模块比较清晰了,但是他的奇葩之处来了,但凡你在CommonAction.class.php里面设置方法,比如增删改查,你在数据库node表里面设置:

id=3,name=Public,pid=1,level=2

但凡用户拥有了这个public权限,public权限下的增删改查都会出现在其他模块

你可能感兴趣的:(thinkPHP学习3-thinkPHP RBAC)