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