標籤:des style blog http color 使用 io 資料
-------------------------------------------------------------------------------------------------------
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‘, ), ), );
[email protected]黑眼詩人 <www.chenwei.ws>----------------------------------
三步驟 實現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.chenwei.ws>
|---------------------------------------------
*/
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‘); //重新導向至提示頁 } }}
你還可以在上述代碼中加入判斷,如:超級管理員角色不受限制,這樣更符合許可權系統的需求。
-------------------------------------------------------------------------------------------------------