[PHP]基於角色的訪問控制RBAC

-------------------------------------------------------------------------------------------------------html

RBAC(Role Based Access Control),意爲基於角色的訪問控制,這裏用戶再也不擁有單獨權限,而是與角色相關聯,經過賦予角色權限,那麼該用戶也就擁有了這個角色的權限; 這裏的角色能夠也理解爲用戶組。數組

 

權限控制位置:在公共的控制器類的構造方法內,這樣子類均需進行權限驗證; 登陸註冊所在控制器能夠不用繼承,以CI框架爲例:包含登陸的控制器直接繼承CI_Controller, 包含其餘方法的控制器繼承MY_Controller進行權限控制。session

 

自定義的RBAC類,最終返回組裝的數組格式,參考以下:框架

$access_list = array(
       'auth'=>array(
          'index'=>array(
              [0]=>'index',
              [1]=>'add',
          ),
          'user'=>array(
              [0]=>'index',
              [1]=>'add',
              [2]=>'delete',
          ),
        ),
     );

 

三步驟 實現RBAC =>函數

一,須要的5張數據表以下:this

  用戶表spa

  角色表(用戶組)code

  用戶和角色關聯表(便於存單個用戶存多個角色; 不然要在用戶表存roleid,多個值)xml

  權限表(節點表:角色id,節點id,節點pid)htm

  角色與權限關聯表

(4張表實現的RABC是採用的單角色思路,能夠省略掉「用戶和角色關聯表」,將角色id直接存入用戶表,能夠省掉一些代碼量)

 

二,經過用戶的id獲取全部的節點權限:

1. 經過用戶的id將用戶的角色id查詢出來,function getRoleId(){}

2. 經過用戶的角色id來獲取全部的節點id,function getNodeId(){}

3. 經過全部的節點id來獲取節點名稱,組裝數組(也可存入session),function getNodes(){}  function getNodeName(){}

 

三,驗證權限:

經過$_GET['c']和$_GET['m']與$access_list['auth']中的進行對比,若是存在,擁有權限,不然無權限,進行踢出; 這裏用到了函數array_key_exists()。

強調:登陸退出在非公共的控制器內,不參與權限控制。

 

若是有使用了Ajax,那麼一樣能夠驗證,代碼局部以下:

/**
|---------------------------------------------
|開啓權限控制方法(以CI框架爲例)
|@黑眼詩人 <www.farwish.com>
|---------------------------------------------
*/
protected
function openCheck() {   $this->load->library('rbac');       //加載rbac類   if( ! $this->rbac->access_check($id))  //rbac中access_check方法檢測權限   {     if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') { echo '您沒有權限!';exit;     //Ajax請求返回值 } else { redirect('admin/show_notice'); //重定向至提示頁 }   } }

你還能夠在上述代碼中加入判斷,如:超級管理員角色不受限制,這樣更符合權限系統的需求。

 

Link: http://www.cnblogs.com/farwish/p/3886805.html

@黑眼詩人 <www.farwishcom>

相關文章
相關標籤/搜索