後臺的權限管理設計思路

  1. <span style="font-family:Arial, Helvetica, sans-serif;background-color:rgb(255,255,255);">在這個項目設計之前,老闆要求使用權限設計,我比較了一些設計方式,感覺都不錯,於是綜合了一下,自己寫一種權限管理</span>  


在權限這一塊出於安全性考慮,我驗證的比較複雜,或許存在不足,如有意見可以交流


一: 管理員表(如下圖)

  1. CREATE TABLE `czl_admin` (  
  2.   `adid` int(11) NOT NULL AUTO_INCREMENT,  
  3.   `adname` varchar(20) NOT NULL,  
  4.   `passwordvarchar(32) NOT NULL,  
  5.   `addlogip` varchar(18) NOT NULL DEFAULT '127.0.0.1',  
  6.   `adlogtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,  
  7.   `adregtime` int(10) NOT NULL,  
  8.   `type` tinyint(1) DEFAULT '0',  
  9.   `rid` tinyint(3) NOT NULL DEFAULT '0',  
  10.   PRIMARY KEY (`adid`),  
  11.   UNIQUE KEY `adname` (`adname`)  
  12. ) ENGINE=MyISAM AUTO_INCREMENT=8 DEFAULT CHARSET=utf8  

權限表

  1.  CREATE TABLE `czl_power` (  
  2.   `powerid` tinyint(3) NOT NULL AUTO_INCREMENT,  
  3.   `controller` varchar(15) NOT NULL,  
  4.   `actionvarchar(15) NOT NULL,  
  5.   `powername` varchar(15) NOT NULL,  
  6.   PRIMARY KEY (`powerid`)  
  7. ) ENGINE=MyISAM AUTO_INCREMENT=11 DEFAULT CHARSET=utf8  


如下表

角色表

  1. CREATE TABLE `czl_role` (  
  2.   `roleid` tinyint(4) NOT NULL AUTO_INCREMENT,  
  3.   `powerid` varchar(50) NOT NULL,  
  4.   `rolename` varchar(10) NOT NULL,  
  5.   PRIMARY KEY (`roleid`)  
  6. ) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8  



字段和建表sql如上,

admin表中rid和角色表關聯

角色表powerid和權限表關聯

角色所屬的權限以字符串的形式存放在表中

我使用的是tp3.2 ,當然權限問題是通用的,和框架沒太大關係

代碼如下

  1. <?php  
  2. namespace Admin\Controller;  
  3. use Think\Controller;  
  4. /* 
  5. *   張鵬飛 
  6. *   2017.4.1 
  7. *   權限 
  8. * 
  9.  */  
  10. class BaseController extends Controller{  
  11.   
  12.     function _initialize(){  
  13.         $adname = cookie('adname');  
  14.         $adid   = cookie('adid');  
  15.   
  16.         if (!isset($adid) && !isset($adname)){  
  17.             header('location:'.U('Log/index'));  
  18.             die;  
  19.         }  
  20.         // 登錄用戶進行再次驗證  
  21.         $where = array(  
  22.             'adname' => passport_decrypt($adname,C('PASSWORD_KEY')),  
  23.             'adid'   => passport_decrypt($adid,C('PASSWORD_KEY')),  
  24.         );  
  25.         $admin = D('Admin');  
  26.         $adminArr = $admin->where($where)->find();  
  27.         if(empty($adminArr)){  
  28.             // 判斷是否爲合法數據  
  29.             header('location:'.U('Home/Index/index'));  
  30.             die;  
  31.         }  
  32.         // 對角色進行管理  
  33.         // 得到對應的角色以及權限  
  34.         $role = D('role');  
  35.         $roleArr = $role->find($adminArr['rid']);  
  36.         if(empty($roleArr)){  
  37.             // 若沒有對應的權限則爲非法用戶  
  38.             header('location:'.U('Home/Index/index'));  
  39.             die;  
  40.         }  
  41.         $power = D('Power');  
  42.         $powerid = explode('|'$roleArr['powerid']);  
  43.   
  44.         $where['powerid'] = ':powerid';  
  45.         foreach ($powerid as $k => $v) {  
  46.             $powerTotalArr[] = $power->field('controller,action')->where($where)->bind(':powerid',$v['powerid'])->find();  
  47.         }  
  48.   
  49.         // 做兩層判斷  
  50.         // 對路徑進行判斷  
  51.         $controller = strtolower(CONTROLLER_NAME);  
  52.         $action = strtolower(ACTION_NAME);  
  53.         $flag = false;  
  54.         foreach ($powerTotalArr as $k => $v) {  
  55.             if(strtolower($v['controller']) == $controller && strtolower($v['action']) == $action){  
  56.                 $flag = true;  
  57.             }  
  58.         }  
  59.         if(!$flagexit('您沒有權限');  
  60.   
  61.   
  62.         // 重組控制器和方法  
  63.         foreach ($powerTotalArr as $k => $v) {  
  64.             if(!in_array($v['controller'],$powerTotalArrStr)) $powerTotalArrStr[] = strtolower($v['controller']);  
  65.             $powerTotalArrStr[] = strtolower($v['controller']).'/'.strtolower($v['action']);  
  66.         }  
  67.   
  68.         $this->assign('powerTotalArrStr',$powerTotalArrStr);  
  69.     }  
  70. }  

--------------------------------------------------------------------------------------------

以下爲分析過程

---------------------------------------------------------------------------------------------

登錄之後會存放cookie,這裏我對cookie做最基本的判斷


  1. if (!isset($adid) && !isset($adname)){  
  2.     header('location:'.U('Log/index'));  
  3.     die;  
  4. }  

這裏是對存放的cookie進行驗證,防止有人僞造cookie

adid和adname來查數據表

  1.   
  1. if (!isset($adid) && !isset($adname)){  
  2.     header('location:'.U('Log/index'));  
  3.     die;  
  4. }  

  1. // 登錄用戶進行再次驗證  
  2. $where = array(  
  3.     'adname' => passport_decrypt($adname,C('PASSWORD_KEY')),  
  4.     'adid'   => passport_decrypt($adid,C('PASSWORD_KEY')),  
  5. );  
  6. $admin = D('Admin');  
  7. $adminArr = $admin->where($where)->find();  
  8. if(empty($adminArr)){  
  9.     // 判斷是否爲合法數據  
  10.     header('location:'.U('Home/Index/index'));  
  11.     die;  
  12. }  



  1.   
  1. passport_decrypt 這是解密函數,在前面的文章中有此介紹 <a href="http://blog.csdn.net/fei003/article/details/66472358" target="_blank">http://blog.csdn.net/fei003/article/details/66472358</a> ,  


對權限進行初步驗證,此時訪問鏈接的話,會拒絕並跳轉  ,但是如何在頁面中實現權限呢,就是說沒有權限的菜單不會顯示

  1.   
  1. <span style="font-family:Arial, Helvetica, sans-serif;">    </span><span style="font-family:Arial, Helvetica, sans-serif;"> <span>      </span>// 對角色進行管理</span>  
  1.   
  1. // 得到對應的角色以及權限  
  2. $role = D('role');  
  3. $roleArr = $role->find($adminArr['rid']);  
  4. if(empty($roleArr)){  
  5.     // 若沒有對應的權限則爲非法用戶  
  6.     header('location:'.U('Home/Index/index'));  
  7.     die;  



對權限進行重組,並傳值到模板中,在這裏如果該用戶沒有此權限,經過判斷後則對菜單進行屏蔽處理




  1.   
  1. foreach ($powerTotalArr as $k => $v) {  
  2.     if(!in_array($v['controller'],$powerTotalArrStr)) $powerTotalArrStr[] = strtolower($v['controller']);  
  3.     $powerTotalArrStr[] = strtolower($v['controller']).'/'.strtolower($v['action']);  
  4. }  
  5.   
  6. $this->assign('powerTotalArrStr',$powerTotalArrStr);  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章