后台的权限管理设计思路

[sql]  view plain  copy
  1. "font-family:Arial, Helvetica, sans-serif;background-color:rgb(255,255,255);">在这个项目设计之前,老板要求使用权限设计,我比较了一些设计方式,感觉都不错,于是综合了一下,自己写一种权限管理  


在权限这一块出于安全性考虑,我验证的比较复杂,或许存在不足,如有意见可以交流


一: 管理员表(如下图)

[sql]  view plain  copy
  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张图片

权限表

[sql]  view plain  copy
  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  


如下表

后台的权限管理设计思路_第2张图片

角色表

[sql]  view plain  copy
  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  


后台的权限管理设计思路_第3张图片


字段和建表sql如上,

admin表中rid和角色表关联

角色表powerid和权限表关联

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

我使用的是tp3.2 ,当然权限问题是通用的,和框架没太大关系

代码如下

[php]  view plain  copy
  1. namespace Admin\Controller;  
  2. use Think\Controller;  
  3. /* 
  4. *   张鹏飞 
  5. *   2017.4.1 
  6. *   权限 
  7. * 
  8.  */  
  9. class BaseController extends Controller{  
  10.   
  11.     function _initialize(){  
  12.         $adname = cookie('adname');  
  13.         $adid   = cookie('adid');  
  14.   
  15.         if (!isset($adid) && !isset($adname)){  
  16.             header('location:'.U('Log/index'));  
  17.             die;  
  18.         }  
  19.         // 登录用户进行再次验证  
  20.         $where = array(  
  21.             'adname' => passport_decrypt($adname,C('PASSWORD_KEY')),  
  22.             'adid'   => passport_decrypt($adid,C('PASSWORD_KEY')),  
  23.         );  
  24.         $admin = D('Admin');  
  25.         $adminArr = $admin->where($where)->find();  
  26.         if(empty($adminArr)){  
  27.             // 判断是否为合法数据  
  28.             header('location:'.U('Home/Index/index'));  
  29.             die;  
  30.         }  
  31.         // 对角色进行管理  
  32.         // 得到对应的角色以及权限  
  33.         $role = D('role');  
  34.         $roleArr = $role->find($adminArr['rid']);  
  35.         if(empty($roleArr)){  
  36.             // 若没有对应的权限则为非法用户  
  37.             header('location:'.U('Home/Index/index'));  
  38.             die;  
  39.         }  
  40.         $power = D('Power');  
  41.         $powerid = explode('|'$roleArr['powerid']);  
  42.   
  43.         $where['powerid'] = ':powerid';  
  44.         foreach ($powerid as $k => $v) {  
  45.             $powerTotalArr[] = $power->field('controller,action')->where($where)->bind(':powerid',$v['powerid'])->find();  
  46.         }  
  47.   
  48.         // 做两层判断  
  49.         // 对路径进行判断  
  50.         $controller = strtolower(CONTROLLER_NAME);  
  51.         $action = strtolower(ACTION_NAME);  
  52.         $flag = false;  
  53.         foreach ($powerTotalArr as $k => $v) {  
  54.             if(strtolower($v['controller']) == $controller && strtolower($v['action']) == $action){  
  55.                 $flag = true;  
  56.             }  
  57.         }  
  58.         if(!$flagexit('您没有权限');  
  59.   
  60.   
  61.         // 重组控制器和方法  
  62.         foreach ($powerTotalArr as $k => $v) {  
  63.             if(!in_array($v['controller'],$powerTotalArrStr)) $powerTotalArrStr[] = strtolower($v['controller']);  
  64.             $powerTotalArrStr[] = strtolower($v['controller']).'/'.strtolower($v['action']);  
  65.         }  
  66.   
  67.         $this->assign('powerTotalArrStr',$powerTotalArrStr);  
  68.     }  
  69. }  

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

以下为分析过程

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

登录之后会存放cookie,这里我对cookie做最基本的判断


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

这里是对存放的cookie进行验证,防止有人伪造cookie

adid和adname来查数据表

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

[php]  view plain  copy
  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. }  

 
  


[php]  view plain  copy
  1.   
[php]  view plain  copy
  1. passport_decrypt 这是解密函数,在前面的文章中有此介绍 "http://blog.csdn.net/fei003/article/details/66472358" target="_blank">http://blog.csdn.net/fei003/article/details/66472358 ,  

 
  


对权限进行初步验证,此时访问链接的话,会拒绝并跳转  ,但是如何在页面中实现权限呢,就是说没有权限的菜单不会显示

[php]  view plain  copy
  1.   
[php]  view plain  copy
  1. "font-family:Arial, Helvetica, sans-serif;">    "font-family:Arial, Helvetica, sans-serif;"      // 对角色进行管理  
[php]  view plain  copy
  1.   
[php]  view plain  copy
  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;  
 
  
 
  



对权限进行重组,并传值到模板中,在这里如果该用户没有此权限,经过判断后则对菜单进行屏蔽处理




[php]  view plain  copy
  1.   
[php]  view plain  copy
  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);  
 
 

你可能感兴趣的:(后台)