2015-12-18 21:17:46
連續看了幾天的ThinkPHP框架,目前看到基於角色的用戶訪問權限控制。
相關代碼如下:
數據庫
用戶表(管理員)
CREAATE TABLE `sw_manager` ( `mg_id` int(11) NOT NULL AUTO_INCREMENT, `mg_name` varchar(32) NOT NULL, `mg_pwd` varchar(32) NOT NULL, `mg_time` int(10) unsigned NOT NULL COMMENT '時間', `mg_role_id` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '角色id', PRIMARY KEY (`mg_id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
權限表
CREATE TABLE `sw_auth` ( `auth_id` smallint(6) unsigned NOT NULL AUTO_INCREMENT, `auth_name` varchar(20) NOT NULL COMMENT '權限名稱', `auth_pid` smallint(6) unsigned NOT NULL COMMENT'父id', `auth_c` varchar(32) NOT NULL DEFAULT '' COMMENT '控制器', `auth_a` varchar(32) NOT NULL DEFAULT '' COMMENT '操作方法', `auth_path` varchar(32) NOT NULL COMMENT '全路徑', `auth_level` tinyint(4) NOT NULL DEFAULT '0' COMMENT '級別', PRIMARY KEY(`auth_id`) ) ENGING-InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
角色表
CREATE TABLE `sw_role` ( `role_id` smallint(6) unsigned NOT NULL AUTO_INCREMENT, `role_name` varchar(20) NOT NULL COMMENT '角色名稱', `role_auth_ids` varchar(128) NOT NULL DEFAULT '' COMMENT '權限id,1,3,..', `role_auth_ac` text COMMENT '控制器2-操作3,控制器1-操作6,...', PRIMARY KEY(`role_id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
數據模擬:
1.權限數據
產品中心(產品展示,最新產品,分類管理,子類管理) 高級管理(用戶留言,留言簿,產品訂購,文件管理) 系統管理(基本設置,樣式管理,首頁設置,管理員列表)
頂級權限 insert into sw_auth values ( 100,'產品中心',0,'','',100,0 ); insert into sw_auth values ( 101,'高級管理',0,'','',101,0 ); insert into sw_auth values ( 102,'系統管理',0,'','',102,0 ); insert into sw_auth values ( 103,'權限管理',0,'','',103,0 ); 次級權限 insert into sw_auth values ( 104,'產品展示',100,'Goods','show','100-104',1 ); insert into sw_auth values ( 105,'最新產品',100,'Goods','showlist','100-105',1 ); insert into sw_auth values ( 106,'分類管理',100,'Goods','cate','100-106',1 ); insert into sw_auth values ( 107,'用戶留言',101,'Goods','words','101-107',1 ); insert into sw_auth values ( 108,'留言簿', 101,'Goods','wordsbook','101-108',1 ); insert into sw_auth values ( 109,'基本設置',102,'Goods','set','102-109',1 ); insert into sw_auth values ( 110,'樣式管理',102,'Goods','css','102-110',1 ); insert into sw_auth values ( 111,'用戶列表',103,'Goods','userlist','103-111',1 ); insert into sw_auth values ( 112,'角色管理',103,'Goods','role','103-112',1 ); insert into sw_auth values ( 113,'權限列表',103,'Goods','auth','103-113',1 );
2.角色數據
sw_role 站主 所有權限(103,104,105,106,107,108,109) 管理員 部分權限(104,105,109) 版主 部分權限(103,108)
角色 insert into sw_role values (10,'站主','100,101,102,103,104,105,106,107,108,109,110,111,112,113','Goods-show,Goods-showlist,Goods-cate,Goods-words,Goods-wordsbook,Goods-set,Goods-css'); insert into sw_role values (11,'管理員','100,102,104,105,109','Goods-showlist,Goods-cate,Goods-css'); insert into sw_role values (12,'版主','100,101,103,106,108,113','Goods-show,Goods-set');
3.流程說明
Index控制器內 獲取用戶的角色id,進而獲得角色權限 進行判斷是否展現數據 Index控制器--->left方法--->left.html模板 Index控制器
//(1)根據用戶id獲取本身記錄信息$mg_id = session('admin_id');//D('Manager')實例化了一個Manager的Model對象
$manager_info = D('Manager')->find($mg_id); $role_id = $manager_info['mg_role_id'];//(2)根據role_id 獲得本身記錄信息
$role_info = D('Role')->find($role_id); $auth_ids = $role_info['role_auth_ids'];//(3)根據$auth_ids 獲得具體權限
$auth_infoA = D('Auth')->where("auth_level=0 and auth_id in($auth_ids)")->select();//父級
$auth_infoB = D('Auth')->where("auth_level=1 and auth_id in($auth_ids)")->select();//子級
$this->assign('auth_infoA',$auth_infoA); $this->assign('auth_infoB',$auth_infoB);//傳到模板中
$this->assign('auth_info',$auth_info); $this->display();
4.模板 left.html
{foreach $auth_infoA as $k=>$v} <table cellspacing=0 cellpadding=0 width=150 border=0> <tr height=22><td> background={$smarty.const.ADMIN_IMG_URL}/menu_bt.jpg ><a class=menuparent onclick=expand({$v.auth_id}) href="javascript:void(0);">{$v.auth_name}</a></td></tr> <tr height=4><td></td></tr> </table> <table id=child{$v.auth_id}> {foreach $auth_infoB as $k2=>$v2} {if $v2.auth_pid == $v.auth_id} <tr height=20><td align=middle width=30><img height=9 src="{$smarty.const.ADMIN_IMG_URL}/menu_icon.gif" width=9></td> <td><a class=menuchild href="{$smarty.const.__MODULE__}/{$v2.auth_c}/{$v2.auth_a}" target=right>{$v2.auth_name} </a></td></tr> {/if} {/foreach} <tr height=4> <td colspan=2></td> </tr> </table> {/foreach}