RBAC
rbac:Role Based Access Controll,基於角色的訪問控制。
今天理一理RBAC,話不多說,直接切入主題
功能需求:
- 權限管理(無限極)
- 角色管理(可以分配權限)
- 管理員管理(管理員屬於哪些角色)
- 后台左側顯示當前登錄用戶所擁有的權限
- 超級管理員擁有所有權限
實現
建表(我們需要三個表,管理員表、角色表、權限表,tip:也可用其它建表方式)
管理員表
權限表
角色表
我制作完的三張表的CRUD,后台首頁效果展示(具體的增刪改查就不列步驟了):
管理員表
權限表
角色表
功能一實現-無限極權限分類
在這里實現無限極分類不是通過遞歸,而是通過建表時候多加的一個字段 auth_path
不懂的看我另一篇博文有寫不使用遞歸實現無限極,這里就不多說了
功能二實現-角色管理分配權限
頁面實現
視圖顯示沒有什么可說的,有需要源碼的、有問題的留言,收集表單信息(tp代碼示意)
然后我們講得到的數組轉換成字符串,通過字符串查詢所有權限信息
返回數組
接下來拼接字段role_auth_ac,通過get過來的角色id更新數據庫
1 public function saveAuth($arr,$role_id){ 2 $str = implode(',',$arr); 3 $str = rtrim($str); 4
5 $auth_info = D('Auth')->select($str); 6 $s = '';//用於拼接 role_auth_ac 字段
7 foreach($auth_info as $v){ 8 if(!empty($v['auth_c']) && !empty($v['auth_a'])){ 9 $s .= $v['auth_c'] .'-'. $v['auth_a'].','; 10 } 11 } 12 $s = rtrim($s,','); 13 $sql = "update jy_role set role_auth_ids = '$str',role_auth_ac = '$s' where role_id = $role_id"; 14 return $this->execute($sql); 15 }
功能三實現-管理員屬於的角色
功能四/五 實現-登錄左側顯示所擁有權限
比如我現在用另一個賬號登錄,(只顯示他有的權限)
基本思想就是,首先登錄后將管理員的角色id獲得,不同的角色id根據數據庫里的數據顯示不同權限菜單,如下,我的jy_test只有兩個權限
視圖中顯示如下
tp代碼示意
$admin_id = session("admin_info['admin_id']");//管理員id
$admin_info = D('Admin')->find($admin_id);//管理員信息
$role_id = $admin_info['role_id'];//管理員角色id //角色信息
$role_info = M('Role')->find($role_id); //角色擁有的權限字符串
$auth_ids = $role_info['role_auth_ids']; if($role_id === 0){ //超級管理員獲取所有權限菜單
$auth_infoA = M('Auth')->where("auth_level = 0")->select(); //頂級權限
$auth_infoB = M('Auth')->where("auth_level = 1")->select(); //次頂級權限
}else{ $auth_infoA = M('Auth')->where("auth_level = 0 and auth_id in ($auth_ids)")->select(); //頂級權限
$auth_infoB = M('Auth')->where("auth_level = 1 and auth_id in ($auth_ids)")->select(); //次頂級權限
后記:只是大致籠統粗糙的說了下流程,有需要源碼和有問題的可以私我!