后台的权限管理设计思路

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

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