TP框架中自带的rbac
如果你是一个TP的重度使用者的话,请自动略过笔者以下文字
权限管理我在成为一个开发者1年半内,接触过2种,一种就是数学方式 比如我们文件夹权限的755这种权限管理的方式,这种二进制的权限管理的方式 无耻得引入 http://www.cnblogs.com/qfcndtt/archive/2012/08/03/2621713.html这里讲解的也比较详细,不过这种方式适合于权限节点相对较少的系统。也很轻便。
下面正式开始THINKPHP的RBAC的讲解
在系统目录下的Librar/Org/Util目录下的Rbac.class.php
在config中
拥有着RBAC的相关的配置文件
数据库的话,我以我现在的一个系统为例
角色表 role
用户对应的角色表 role_user
节点表 node
权限表 access
先解析下Rbac中拥有的比较重要的方法
saveAccessList($authId=null)
这里保存可以传空值的前提是 你在用户登录操作的时候要在 $_SESSION[C('USER_AUTH_KEY')] 中把用户的uid保存下来,然后这里会将用户所对应的角色拥有的权限都保存在$_SESSION['_ACCESS_LIST']中。 有2中例外是不保存的,一个是管理员用户(这个用户比较特殊所以需要在管理员登录的时候指定一个$_SESSION[C('ADMIN_AUTH_KEY')]) 一个是开启了实时认证 (实时认证他是不保存权限的每次权限判断的时候都会重新去获取用户的权限)
checkAccess()
这个是判断用户访问的模块和方法是否需要权限认证 (此方法内部调用的无需关心)
checkLogin()
该方法是判断用户是否登录,如果未登录则跳转到指定路径,正常的系统会跳到用户登录页面
AccessDecision()
该方法可是这里权限判断的关键点,因为这个方法就是判断用户是否有访问权限的,具体的逻辑是先去判断是否需要权限认证(checkAccess),然后去看是否是管理员,如果不是管理员就看是否开启了实时认证,如果开启了,就再次去调取用户的权限列表,然后去判断访问的权限是否在数组里,如果没开启则直接从$_SESSION['_ACCESS_LIST']中读取判断。
getAccessList($authId)
这里个人觉得才是这个类中的最为重要的方法。具体的话,笔者还是希望读者自己去看下这里的代码,应该核心就是那几个sql语句,做到了角色继承,不过我做权限管理的话,还是把这个功能默认放弃了,觉得不太方便拓展。
/***********现在我讲解下如何使用这个Rbac*************/
1:用户登录的情况下
用户登录成功后保存authId;判断是否是管理员,然后调用saveAccessList去保存权限
2:用户在访问系统的时候我们要做权限判断
先去判断用户是否登录,如果未登录跳回登录页面
然后去判断用户是否有访问的权限,如果没有则给定ajax或者页面访问的报错方式
看吧就是这么简单,不过我还是建议用户尤其是经常使用tp的开发者,多去看下这些方法的源代码,毕竟读源代码对于个人的提升是很大的。