一直在用thinkphp做項目,tp有個規定的功能很好,就是分權限管理。以前大體看過THINKPHP 的RBAC的介紹,不過沒仔細研究 ,通過這幾次的項目實訓,發現RBAC.Class.php還是非常精煉的,使用起來也是夠簡單的,而且很靈活。但是恰恰是這靈活性讓新手感到迷惑!好了,不多說了,一下內容是給新手看的,老手可以略過了。下面小濤說一下對RBAC的大體理解:
先看下官方給的實例所用到的數據表,在手冊中就能找到:
RBAC 用到了5個數據表
think_user (用戶表)
think_role (用戶分組表)
think_node (操作節點)
think_role_user (用戶和用戶分組的對應)
think_access (各個操作和用戶組的對應)
這里重點說一下 think_note
think_note 其實就是記錄下了整個網站操作對應的 項目名稱 模塊名稱 和 操作名稱。
字段name就是當項目,模塊或者操作的名稱了。
字段PID 記錄他們的從屬關系,比如某一個模塊是屬于哪個項目,某個操作屬于哪個模塊。
字段level 表示該節點的層級 換句話就是說 level=1 為項目 ,level=2為模塊 ,level=3就是操作了,比如說 admin項目,他的PID 就是 0 (項目的PID都是0) level就是1,nane就是admin了,admin項目下面有的user模塊,它的level就應該是2,pid就是admin的id, admin下面user模塊的add操作,level就該是3了,pid就應該是前面的user對應的ID.
再說下 rbac類的 方法
authenticate($map,$model='')方法 傳入查詢用戶的條件和用戶表的MODEL 返回數組包含用戶的信息
saveAccessList($authId=null)方法 傳入用戶的ID 此方法不返回值,只是設置 $_SESSION['_ACCESS_LIST']的值,其中包含了所有該用戶對應的用戶組的有權限操作的所有節點 $_SESSION['_ACCESS_LIST']['項目名']['模塊名']['操作名'],以后判斷權限就是判斷當前項目,模塊和操作是否在 $_SESSION['_ACCESS_LIST']中能找到。s
checkAccess() 方法 檢測當前模塊和操作是否需要驗證 返回bool類型
checkLogin()方法 檢測登錄
AccessDecision($appName=APP_NAME) 方法 就是檢測當前項目模塊操作 是否在$_SESSION['_ACCESS_LIST']數組中,也就是說 在 $_SESSION['_ACCESS_LIST'] 數組中$_SESSION['_ACCESS_LIST']['當前操作']['當前模塊']['當前操作']是否存在。如果存在表示有權限 否則返回flase。
getAccessList($authId) 方法 通過查詢數據庫 返回權限列表 $_SESSION['_ACCESS_LIST']的值了。
上面的記錄就是 我個人對RBAC的理解。在開發過程中還遇到個問題,我的項目一有一個 ,但是我又想把 幾個模塊分開管理。想了半天發現AccessDecision($appName=APP_NAME) 是可以傳項目名稱的。那么 我們先分幾個組,也就是LEVEL=1,PID=0的,然后 把模塊分組管理。在使用的時候就麻煩點。每個分組都建一個基類,在基類中if (! RBAC::AccessDecision ()) { 手動給 AccessDecision添加參數,就是當前分組的名稱。然后屬于某個分組的模塊就引用這基類。這樣就達到了同一項目下 分組管理模塊的功能了。
最后說一下RBAC.Class.php的大體意思:
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認證就完成了。
技術分享,技術交流,小濤與您共同成長……