流程:
總共有3張表,許可權,角色,管理員 其中角色表為中間串連紐帶
1.完善角色表,實現增刪改差,以及為角色指派許可權的功能,儲存許可權的ID與action controller在role表,方便後便用2.完善許可權表,實現增刪改查,分配對應的許可權3.完善管理員列表,分配對應的角色
原理:
問:left.html根據不同管理員身份顯示不同分類列表。答:根本--role表裡的role_auth_ids 進行判斷,根據SQL語句的IN欄位來查詢對應資料【若為管理員時,if判斷來繞開in操作,從而全部查詢出來】問:如何防止專業人員手動輸入URL來進入不是自己許可權的頁面。答:根本-- role表裡的 role_ath_ac欄位 在背景所有控制器中,繼承一個總控制器,在總控制器的構造方法進行動態判斷許可權【CONTROLLER_NAME,ACTION_NAME】是實現動態識別的關鍵
總結:
role表是三個表的中間聯絡,也是實現不同管理員分權的關鍵。 關鍵性的查詢判斷,從分權的操作,role表主角,其他倆表輔助。
//-----右邊頁面為何手動輸入URL,存取權限外的頁面會提示無許可權。【AdminController.class.php/__contruct(){}】-----//1.若當前訪問的方法不再公用允許的方法內;2.若不是超級管理員;3.若不再該管理員角色許可權的允許的頁面內//則發出沒有許可權提示【$now_ac裡的兩個常量是關鍵,自動識別當前是哪個控制器下的方法】$now_ac =CONTROLLER_NAME."-".ACTION_NAME;$allow_ac = array('Index-left','Index-right','Index-head','Index-index','Manager-login','Index-modifypwd','Index-verifyImg');$auth_ac = $auth_ac[0]['role_auth_ac'];//從資料庫查詢出來的有許可權的頁面if(!in_array($now_ac,$allow_ac) && $_SESSION['mg_id'] !=1 && strpos($auth_ac,$now_ac) === false){ $this->error('沒有存取權限',U("right")); }
//------左部列表為何不同管理顯示不同的導航。【index.class.php/left(){}】------ // // 查詢list巨集指令清單 // @return 三維數組 // $arr['p_list'] 包含所有頂級列表的二維數組 // $arr['c_list'] 包含所有二級列表的二維數組 // 上述兩個組合成一個三維數組返回 // function get_list(){ $mg = M('cms_manager'); $role = M('cms_role'); $role_id = $mg->field("mg_role_id")->where("mg_id=$_SESSION[mg_id] ")->find(); $auth_ids = $role->field("role_auth_ids")->where("role_id=$role_id[mg_role_id] ")->find(); $sql = "SELECT auth_id,auth_name FROM cms_auth WHERE auth_level='0'"; if($_SESSION['mg_id'] !="1") $sql.= " and auth_id in ($auth_ids[role_auth_ids]) "; $p_list = $mg->query($sql); $sql = "SELECT auth_id,auth_pid,auth_name,auth_a FROM cms_auth WHERE auth_level='1'"; if($_SESSION['mg_id'] !="1") $sql.= " and auth_id in ($auth_ids[role_auth_ids]) "; $c_list = $mg->query($sql); $all_list=array( "p_list"=>$p_list, "c_list"=>$c_list, ); // show($all_list);exit; return $all_list; }
**一.rbac許可權管理 【必須等項目大體作完,最後來做】** role base access (基於角色的存取權限控制)
sw_auth //許可權表
`auth_id` 主鍵 `auth_name` 許可權名稱, `auth_pid` 父id,值:對應最高許可權的ID, 它若是最高許可權則沒有,值為0【目的在於,方便下拉式功能表顯示,有個匹配,是誰的下拉式功能表】 `auth_c` 控制器,controller控制器 Goods ; 它若是最高許可權則沒有,值無【目的在防止直接存取URL突破許可權,規定你只能訪問它】 `auth_a` 操作方法,action 方法 showlist; 它若是最高許可權則沒有,值無【目的在防止直接存取URL突破許可權,規定你只能訪問它】 `auth_path` 全路徑:【使用者資訊排序使用】 【目的在許可權管理LIST查看來排序,好看】 ① : 如果是頂級許可權,全路徑等於本記錄主索引值 (auth_id) ② :如果不是頂級許可權,全路徑等於 "父級全路徑-(中恒線)本記錄主索引值" (auth_pid-auth_id) `auth_level` 層級, 【目的在於sql區分下拉式功能表時,誰是1級菜單,誰是2級菜單】 基本:0頂級許可權 1次頂級許可權 2次次頂級 許可權呈現縮排關係使用 許可權資料類比:
insert into sw_auth values (1,'商品管理',0,'','',1,0); insert into sw_auth values (2,'訂單管理',0,'','',2,0); insert into sw_auth values (3,'廣告管理',0,'','',3,0); insert into sw_auth values (4,'商品列表',1,'Goods','showlist',"1-4",1); insert into sw_auth values (5,'添加商品',1,'Goods','add',"1-5",1); insert into sw_auth values (6,'商品分類',1,'Goods','cate',"1-6",1); insert into sw_auth values (7,'使用者評論',1,'User','comment',"1-7",1); insert into sw_auth values (8,'訂單列表',2,'Order','showlist',"2-8",1); insert into sw_auth values (9,'訂單列印',2,'Order','print',"2-9",1); insert into sw_auth values (10,'添加訂單',2,'Order','add',"2-10",1); insert into sw_auth values (11,'廣告列表',3,'Advert','showlist',"3-11",1); insert into sw_auth values (12,'廣告位置',3,'Advert','position',"3-12",1);
sw_role //角色表
`role_id` 主鍵 `role_name` '角色名稱', `role_auth_ac` '模組-操作',關聯許可權的控制器、方法串連的資訊"Goods-showlist,Goods-add,Goods-cate"【目的在於,懂行人直接輸入URL訪問更多許可權】 `role_auth_ids` 外鍵'該角色的對應許可權ID',"1,4,5,6" 關聯許可權的主索引值用逗號串連的資訊(如果有上級許可權,也把上級許可權的id進行關聯)
insert into sw_role values (1, '經理', "1,4,5,6","Goods-showlist,Goods-add,Goods-cate"); insert into sw_role values (2, '主管', "2,3,8,11","Order-showlist,Advert-showlist");
**sw_admin //管理員表** `mg_id` 主鍵 `mg_name` 管理員賬戶名 `mg_pwd` 管理員密碼 `mg_time` 上次登入時間, `mg_role_id` 外鍵,角色id,二.通過類比好的資料進行程式開發 a)使用者登入系統,根據具體角色顯示,左邊許可權按鈕 b)在左邊顯示對應的許可權資訊 i.使用者登陸系統顯示許可權資訊$_SESSION['mg_id'] ii.根據SESSION['mg_id']資訊獲得角色資訊['role_id'] iii.根據['role_id']資訊獲得許可權列表資訊['auth_id,name']三.超級管理員不需要許可權控制admin a)在Index/left方法裡邊,若為admin,則顯示全部許可權 if($_SESSION['mg_id'] != 1 ){$sql .= " and auth_id in ($auth_ids)";}四.防止內行手輸入URL訪問更多許可權 加入判斷 1.使用者訪問的控制器和方法,必須和他對應的角色表裡的【ac資訊】比較 2.`role_auth_ac`若有你訪問的許可權,則訪問 因為是後台每一個頁面都要驗證,把它寫一個父類,把所有公用方法寫入它,讓所有後台方控制器繼承它 位置: Component\AdminController.class.php 注意: 1.一些公有的方法,不進行許可權限制 2.系統管理員,不進行許可權限制 3.只允許訪問角色對應的許可權 【好好看看if判斷的寫法,理解】維護三部分資料:角色,許可權,1.角色 Admin/Role/showlist 角色:顯示角色列表資訊,給角色指派許可權 在設定時,把已經有的許可權顯示出來2.許可權維護