THINKPHP RBAC

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中設置的咯

相關文章
相關標籤/搜索