thinkPHP带了一个扩展的RBAC模型,模型和think一样的奇葩,不走寻常路,但凡学习过其他框架童鞋,都会被绕晕倒的,PHP的debug不太会用,导致thinkPHP常常出现不显示内容,也没有错误提示,用记事本编辑的童鞋真的勇气可嘉啊,可惜Eclipse老是提示thinkPHP到处是错误,无法编辑,只有回到sublime text2;
废话好多!
1,thinkPHP RBAC最难的是 数据库的理解,一旦理解了数据库,其他的就容易了
他用了五张表来表示RBAC模型,其实就是经典的W模型:
图:经典RBAC的W模型
用户user与角色role通过映射表user_role关联,角色role与权限permission通过映射表role_permission关联,就是RBAC最简易模型,基于角色的权限模型,要是thinkPHP给出这样一个数据库表,那好多童鞋都要少走很多弯路了,可惜thinkPHP给出了一个另外命名的表:
图:thinkPHP的RBAC模型
和上面的经典图对比,就能看出其实也是一个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权限下的增删改查都会出现在其他模块