[原文](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操作。