thinkphp RBAC使用说明BY holy


看到一篇关于RBAC的文章,和大家分享一下

一直听大伙抱怨RBAC麻烦,难懂。
我看了一下官方的demo,的确是很繁琐,而且其用到的config.php参数及表DDL也与RBAC.Class.php中注释的差异极大,这就使初学者更加迷惑了。我也迷惑了老半天。
今天实在闲的很,于是仔细逐行研究了RBAC.Class.php,总共也就300行代码,去掉注释和换行符只有200行了。
发现RBAC.Class.php还是非常精炼的,使用起来也是够简单的,而且很灵活。
但是恰恰是这灵活性让新手感到迷惑!
好了,不多说了,一下内容是给新手看的,老手可以略过了。
言归正传,我们分两步来啃RBAC。
第一步:了解RBAC里的那些函数是干啥子的。
第二步:使用了RBAC后,我们仔细还需要做啥子工作。
OK,Let's 啃!
第一步:
RBAC.Class.php中有若干函数,其中我们新手直接打交道的却只有一下几个:
authenticate() saveAccessList() checkLogin() AccessDecision()
什么?你问我它们是干啥的?好,且听我先啰嗦几句认证的过程。
1、检查系统是否开启认证功能C('USER_AUTH_ON')
2、检查当前操作是否需要认证
3、如果当前操作需要认证,检查当前用户是否具有权限。if(有),啥也不做。
4、if(没有),检查原因。如果是因为没有登录,跳转至登录页面。如果是没有权限,报错。
这4步就完成了用户的认证,其中 AccessDecision()就搞定了前三步!
而checkLogin()负责第4步中检查浏览器是否登录。
哈哈,还剩下两个了,我想来想去,觉得还是应该放到第二步中来说明

第二步:
既然RBAC.Class.php这么强,帮我们搞定了这么多工作,那么我们是不是啥也不用做了?
答案让大家很失望,我们还需要写一些代码。
首先我们需要在要认证模块中加入一下代码

protected function _initialize(){
Import ( 'ORG.Util.RBAC' );
if (! RBAC::AccessDecision ())//未通过认证
{
// 登录检查
RBAC::checkLogin();

// 提示错误信息 无权限
$this->error ( L ( '_VALID_ACCESS_' ) );


复制代码
目的就是告诉程序,在未通过认证的时候,需要怎么做。
另外,我们需要在用户输入用户名和密码的时候检测一下用户是否输入的正确,这个东东也就是所谓的认证网关。
名称在config.php中用'USER_AUTH_GATEWAY'定义。
我的代码如下所示:
//生成认证条件
$map = array();
$map['account'] = $_POST['account'];
$map["status"] = array('gt',0);
import ( 'ORG.Util.RBAC' );
$authInfo = RBAC::authenticate($map);
//使用用户名、密码和状态的方式进行认证
if(false === $authInfo)
{
$this->error('帐号不存在或已禁用!');
}
else
{
if($authInfo['password'] != md5($_POST['password']))
{
$this->error('密码错误!');
}
$_SESSION[C('USER_AUTH_KEY')] = $authInfo['id'];
if($authInfo['account']=='admin')
{
$_SESSION[C('ADMIN_AUTH_KEY')] = true;
}
// 缓存访问权限
RBAC::saveAccessList();
$this->success('登录成功!');
复制代码
好了,这样一个完整的RBAC认证就完成了。

当然了,你或许还需要一个完整的用户/权限管理系统。
如果你把以上基本原理搞明白,那个就很容易明白了,具体可以参考官方的RBAC示例。
里边不过是对user role role_user node access这几个表做“增删改查”操作,并不涉及基本的RBAC操作。
已经脱离本文的内容了,故不再说明。