RBAC通常狀況下會有五張表,若是很難記的話就能夠這樣記,首先有一個咱們平時的用戶表user,而後就是角色表,系統中有哪些角色role表,而後就是角色-用戶表,也即用戶ID擁有的角色ID對應的數據表。而後就是NODE表用來記錄系統中有哪些模塊,哪些操做的表,而後及時角色-節點表用來記錄系統中角色ID對應的NODEID表。php
分別對應pre_user,pre_role,pre_role_user,pre_node,pre_accessnode
其中,咱們在pre_node表中會加入pid跟level,字段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.數組
如何使用:緩存
在登陸按鈕提交以後寫以下代碼:詳細代碼能夠看yourphpcms的LoginAciton.classs.phpsession
$condition = array();
$condition['username'] =array('eq',$username);app
import ( '@.ORG.RBAC' );
$authInfo = RBAC::authenticate($condition);this
解讀:RBAC::authenticate方法返回用戶表中查詢條件的信息,而後接下來能夠進行密碼對比繼承
完成密碼對比後接下來就會跳到session記錄跟RBAC權限的記錄了ip
$_SESSION['username'] = $authInfo['username'];
$_SESSION['adminid'] = $_SESSION['userid'] = $authInfo['id'];
$_SESSION['groupid'] = $authInfo['groupid'];
$_SESSION['adminaccess'] = C('ADMIN_ACCESS');
$_SESSION[C('USER_AUTH_KEY')] = $authInfo['id'];
$_SESSION['email'] = $authInfo['email'];
$_SESSION['lastLoginTime'] = $authInfo['last_logintime'];
$_SESSION['login_count'] = $authInfo['login_count']+1;ci
if($authInfo['groupid']==1) {
$_SESSION[C('ADMIN_AUTH_KEY')]=true;
}
//保存登陸信息
$data = array();
$data['id'] = $authInfo['id'];
$data['last_logintime'] = $time;
$data['last_ip'] = get_client_ip();
$data['login_count'] = array('exp','login_count+1');
$dao->save($data);
// 緩存訪問權限
RBAC::saveAccessList();
接下來就是權限驗證了,咱們會全部的類都繼承AdminBaseAction.Class.php,而後在_initialize方法中加入以下代碼
// 用戶權限檢查
if (C ( 'USER_AUTH_ON' ) && !in_array(MODULE_NAME,explode(',',C('NOT_AUTH_MODULE')))) {
import ( '@.ORG.RBAC' );
if (! RBAC::AccessDecision ('Admin')) {
//檢查認證識別號
if (! $_SESSION [C ( 'USER_AUTH_KEY' )]) {
//跳轉到認證網關
redirect ( PHP_FILE . C ( 'USER_AUTH_GATEWAY' ) );
}
// 沒有權限 拋出錯誤
if (C ( 'RBAC_ERROR_PAGE' )) {
// 定義權限錯誤頁面
redirect ( C ( 'RBAC_ERROR_PAGE' ) );
} else {
if (C ( 'GUEST_AUTH_ON' )) {
$this->assign ( 'jumpUrl', PHP_FILE . C ( 'USER_AUTH_GATEWAY' ) );
}
// 提示錯誤信息
$this->error ( L ( '_VALID_ACCESS_' ) );
}
}
}
AccessDecision($appName=APP_NAME)方法,就是檢測當前項目模塊操做是否在$_SESSION['_ACCESS_LIST']數組中,若是沒有權限,則判斷$_SESSION [C ( 'USER_AUTH_KEY' )]是否存在,既判斷用戶是否登陸未登陸則跳轉到登陸界面,登陸了則跳出沒有權限操做的界面。
注意,RBAC的五張數據表以及跳轉頁面的地址都是在config.php中設置的咯