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


-------------------------------------------------------------------------------------------------------

RBAC(Role Based Access Control),意為基於角色的訪問控制,這里用戶不再擁有單獨權限,而是與角色相關聯,通過賦予角色權限,那么該用戶也就擁有了這個角色的權限; 這里的角色可以也理解為用戶組。

 

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

 

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

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

 

三步驟 實現RBAC =>

一,需要的5張數據表如下:

  用戶表

  角色表(用戶組)

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

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

  角色與權限關聯表

(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>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM