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