[原文](http://www.thinkphp.cn/document/301.html)
我们分两步来啃RBAC。<br>
第一步:了解RBAC里的那些函数是干啥子的。<br>
第二步:使用了RBAC后,我们还需要做啥子工作。<br>
第一步:<br>
RBAC.Class.php中有若干函数,其中我们新手直接打交道的却只有一下几个:<br>
authenticate()
saveAccessList()
checkLogin()
AccessDecision()<br>
先啰嗦几句认证的过程。<br>
1、检查系统是否开启认证功能<span style='color:red'>C('USER_AUTH_ON')</span>
2、检查当前操作是否需要认证
3、如果当前操作需要认证,检查当前用户是否具有权限。if(有),啥也不做。
4、if(没有),检查原因。如果是因为没有登录,跳转至登录页面。如果是没有权限,报错。
这4步就完成了用户的认证,其中 AccessDecision()就搞定了前三步!
而checkLogin()负责第4步中检查浏览器是否登录。
<br>
第二步:
既然RBAC.Class.php这么强,帮我们搞定了这么多工作,那么我们是不是啥也不用做了?<br>
答案让大家很失望,我们还需要写一些代码。<br>
首先我们需要在要认证模块中加入以下代码<br>
~~~
protected function _initialize(){
Import ( 'ORG.Util.RBAC' );
if (! RBAC::AccessDecision ())//未通过认证
{
// 登录检查
RBAC::checkLogin();
// 提示错误信息 无权限
$this->error ( L ( '_VALID_ACCESS_' ) );
}
}
~~~
目的就是告诉程序,在未通过认证的时候,需要怎么做。
另外,我们需要在用户输入用户名和密码的时候检测一下用户是否输入的正确,这个东东也就是所谓的认证网关。
名称在config.php中用'<span style='color:red'>USER_AUTH_GATEWAY</span>'定义。
我的代码如下所示:
~~~
//生成认证条件
$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操作。