当前位置:首页 > CMS教程 > Thinkphp > 列表

thinkPHP5框架auth权限控制类与用法示例

发布:smiling 来源: PHP粉丝网  添加日期:2021-09-27 09:57:39 浏览: 评论:0 

这篇文章主要介绍了thinkPHP5框架auth权限控制类与用法,结合实例形式分析了thinkPHP5框架扩展auth权限控制类的定义与使用方法,代码注释中备有较为详尽的使用说明与数据库操作语句,需要的朋友可以参考下。

本文实例讲述了thinkPHP5框架auth权限控制类,分享给大家供大家参考,具体如下:

这个是比较简单的用法:

直接把类贴出来,这里我改了,我没有用uid,因为我建的表是admin表,所以代码里对应查询改成了aid

还有表名,我都去掉了前缀

  1. <?php 
  2. // +---------------------------------------------------------------------- 
  3. // | ThinkPHP [ WE CAN DO IT JUST THINK IT ] 
  4. // +---------------------------------------------------------------------- 
  5. // | Copyright (c) 2011 http://thinkphp.cn All rights reserved. 
  6. // +---------------------------------------------------------------------- 
  7. // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) 
  8. // +---------------------------------------------------------------------- 
  9. // | Author: luofei614 <weibo.com/luofei614>  
  10. // +---------------------------------------------------------------------- 
  11. namespace auth; 
  12. /** 
  13.  * 权限认证类 
  14.  * 功能特性: 
  15.  * 1,是对规则进行认证,不是对节点进行认证。用户可以把节点当作规则名称实现对节点进行认证。 
  16.  *   $auth=new Auth(); $auth->check('规则名称','用户id') 
  17.  * 2,可以同时对多条规则进行认证,并设置多条规则的关系(or或者and) 
  18.  *   $auth=new Auth(); $auth->check('规则1,规则2','用户id','and') 
  19.  *   第三个参数为and时表示,用户需要同时具有规则1和规则2的权限。 当第三个参数为or时,表示用户值需要具备其中一个条件即可。默认为or 
  20.  * 3,一个用户可以属于多个用户组(think_auth_group_access表 定义了用户所属用户组)。我们需要设置每个用户组拥有哪些规则(think_auth_group 定义了用户组权限) 
  21.  * 
  22.  * 4,支持规则表达式。 
  23.  *   在think_auth_rule 表中定义一条规则时,如果type为1, condition字段就可以定义规则表达式。 如定义{score}>5 and {score}<100 表示用户的分数在5-100之间时这条规则才会通过。 
  24.  */ 
  25. //数据库 
  26. /* 
  27. -- ---------------------------- 
  28. -- think_auth_rule,规则表, 
  29. -- id:主键,name:规则唯一标识(就是常见的路由列表,如:admin/index/index), title:规则中文名称,例如添加商品 status 状态:为1正常,为0禁用,condition:规则表达式,为空表示存在就验证,不为空表示按照条件验证 
  30. -- ---------------------------- 
  31.  DROP TABLE IF EXISTS `auth_rule`; 
  32. CREATE TABLE `auth_rule` ( 
  33.   `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, 
  34.   `name` char(80) NOT NULL DEFAULT '', 
  35.   `title` char(20) NOT NULL DEFAULT '', 
  36.   `type` tinyint(1) NOT NULL DEFAULT '1', 
  37.   `status` tinyint(1) NOT NULL DEFAULT '1', 
  38.   `condition` char(100) NOT NULL DEFAULT '', # 规则附件条件,满足附加条件的规则,才认为是有效的规则 
  39.   PRIMARY KEY (`id`), 
  40.   UNIQUE KEY `name` (`name`) 
  41. ) ENGINE=MyISAM DEFAULT CHARSET=utf8; 
  42. -- ---------------------------- 
  43. -- auth_group 用户组表, 
  44. -- id:主键, title:用户组中文名称, rules:用户组拥有的规则id, 多个规则","隔开,status 状态:为1正常,为0禁用 
  45. -- ---------------------------- 
  46.  DROP TABLE IF EXISTS `auth_group`; 
  47. CREATE TABLE `auth_group` ( 
  48.   `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, 
  49.   `title` char(100) NOT NULL DEFAULT '', 
  50.   `status` tinyint(1) NOT NULL DEFAULT '1', 
  51.   `rules` char(80) NOT NULL DEFAULT '', 
  52.   PRIMARY KEY (`id`) 
  53. ) ENGINE=MyISAM DEFAULT CHARSET=utf8; 
  54. -- ---------------------------- 
  55. -- group_access 用户组明细表 
  56. -- uid:用户id,group_id:用户组id 
  57. -- ---------------------------- 
  58. DROP TABLE IF EXISTS `group_access`; 
  59. CREATE TABLE `group_access` ( 
  60.   `uid` mediumint(8) unsigned NOT NULL, 
  61.   `group_id` mediumint(8) unsigned NOT NULL, 
  62.   UNIQUE KEY `uid_group_id` (`uid`,`group_id`), 
  63.   KEY `uid` (`uid`), 
  64.   KEY `group_id` (`group_id`) 
  65. ) ENGINE=MyISAM DEFAULT CHARSET=utf8; 
  66.  */ 
  67. class Auth{ 
  68.   //默认配置 
  69.   protected $_config = array
  70.     'auth_on'      => true,           // 认证开关 
  71.     'auth_type'     => 1,             // 认证方式,1为实时认证;2为登录认证。 
  72.     'auth_group'    => 'auth_group',    // 用户组数据表名 
  73.     'auth_group_access' => 'group_access'// 用户-用户组关系表 
  74.     'auth_rule'     => 'auth_rule',     // 权限规则表 
  75.     'auth_user'     => 'admin'       // 用户信息表 
  76.   ); 
  77.   public function __construct() { 
  78.     if (config('auth_config')) { 
  79.       //可设置配置项 auth_config, 此配置项为数组。 
  80.       $this->_config = array_merge($this->_config, config('auth_config')); 
  81.     } 
  82.   } 
  83.   /** 
  84.    * 检查权限 
  85.    * @param name string|array 需要验证的规则列表,支持逗号分隔的权限规则或索引数组 
  86.    * @param uid int      认证用户的id 
  87.    * @param string mode    执行check的模式 
  88.    * @param relation string  如果为 'or' 表示满足任一条规则即通过验证;如果为 'and'则表示需满足所有规则才能通过验证 
  89.    * @return boolean      通过验证返回true;失败返回false 
  90.    */ 
  91.   public function check($name$uid$type=1, $mode='url'$relation='or') { 
  92.     if (!$this->_config['auth_on']) 
  93.       return true; 
  94.     $authList = $this->getAuthList($uid,$type); //获取用户需要验证的所有有效规则列表 
  95.     if (is_string($name)) { 
  96.       $name = strtolower($name); 
  97.       if (strpos($name',') !== false) { 
  98.         $name = explode(','$name); 
  99.       } else { 
  100.         $name = array($name); 
  101.       } 
  102.     } 
  103.     $list = array(); //保存验证通过的规则名 
  104.     if ($mode=='url') { 
  105.       $REQUEST = unserialize( strtolower(serialize($_REQUEST)) ); 
  106.     } 
  107.     foreach ( $authList as $auth ) { 
  108.       $query = preg_replace('/^.+\?/U','',$auth); 
  109.       if ($mode=='url' && $query!=$auth ) { 
  110.         parse_str($query,$param); //解析规则中的param 
  111.         $intersect = array_intersect_assoc($REQUEST,$param); 
  112.         $auth = preg_replace('/\?.*$/U','',$auth); 
  113.         if ( in_array($auth,$name) && $intersect==$param ) { //如果节点相符且url参数满足 
  114.           $list[] = $auth ; 
  115.         } 
  116.       }else if (in_array($auth , $name)){ 
  117.         $list[] = $auth ; 
  118.       } 
  119.     } 
  120.     if ($relation == 'or' and !emptyempty($list)) { 
  121.       return true; 
  122.     } 
  123.     $diff = array_diff($name$list); 
  124.     if ($relation == 'and' and emptyempty($diff)) { 
  125.       return true; 
  126.     } 
  127.     return false; 
  128.   } 
  129.   /** 
  130.    * 根据用户id获取用户组,返回值为数组 
  131.    * @param uid int   用户id 
  132.    * @return array    用户所属的用户组 array( 
  133.    *   array('uid'=>'用户id','group_id'=>'用户组id','title'=>'用户组名称','rules'=>'用户组拥有的规则id,多个,号隔开'), 
  134.    *   ...) 
  135.    */ 
  136.   public function getGroups($uid) { 
  137.     static $groups = array(); 
  138.     if (isset($groups[$uid])) 
  139.       return $groups[$uid]; 
  140.     $user_groups = \think\Db::name($this->_config['auth_group_access']) 
  141.       ->alias('a'
  142.       ->join($this->_config['auth_group']." g""g.id=a.group_id"
  143.       ->where("a.aid='$uid' and g.status='1'"
  144.       ->field('aid,group_id,title,rules')->select(); 
  145.     $groups[$uid] = $user_groups ? $user_groups : array(); 
  146.     return $groups[$uid]; 
  147.   } 
  148.   /** 
  149.    * 获得权限列表 
  150.    * @param integer $uid 用户id 
  151.    * @param integer $type 
  152.    */ 
  153.   protected function getAuthList($uid,$type) { 
  154.     static $_authList = array(); //保存用户验证通过的权限列表 
  155.     $t = implode(',',(array)$type); 
  156.     if (isset($_authList[$uid.$t])) { 
  157.       return $_authList[$uid.$t]; 
  158.     } 
  159.     if$this->_config['auth_type']==2 && isset($_SESSION['_auth_list_'.$uid.$t])){ 
  160.       return $_SESSION['_auth_list_'.$uid.$t]; 
  161.     } 
  162.     //读取用户所属用户组 
  163.     $groups = $this->getGroups($uid); 
  164.     $ids = array();//保存用户所属用户组设置的所有权限规则id 
  165.     foreach ($groups as $g) { 
  166.       $ids = array_merge($idsexplode(',', trim($g['rules'], ','))); 
  167.     } 
  168.     $ids = array_unique($ids); 
  169.     if (emptyempty($ids)) { 
  170.       $_authList[$uid.$t] = array(); 
  171.       return array(); 
  172.     } 
  173.     $map=array
  174.       'id'=>array('in',$ids), 
  175.       'type'=>$type
  176.       'status'=>1, 
  177.     ); 
  178.     //读取用户组所有权限规则 
  179.     $rules = \think\Db::name($this->_config['auth_rule'])->where($map)->field('condition,name')->select(); 
  180.     //循环规则,判断结果。 
  181.     $authList = array();  // 
  182.     foreach ($rules as $rule) { 
  183.       if (!emptyempty($rule['condition'])) { //根据condition进行验证 
  184.         $user = $this->getUserInfo($uid);//获取用户信息,一维数组 
  185.         $command = preg_replace('/\{(\w*?)\}/''$user[\'\\1\']'$rule['condition']); 
  186.         //dump($command);//debug 
  187.         @(eval('$condition=(' . $command . ');')); 
  188.         if ($condition) { 
  189.           $authList[] = strtolower($rule['name']); 
  190.         } 
  191.       } else { 
  192.         //只要存在就记录 
  193.         $authList[] = strtolower($rule['name']); 
  194.       } 
  195.     } 
  196.     $_authList[$uid.$t] = $authList
  197.     if($this->_config['auth_type']==2){ 
  198.       //规则列表结果保存到session 
  199.       $_SESSION['_auth_list_'.$uid.$t]=$authList
  200.     } 
  201.     return array_unique($authList); 
  202.   } 
  203.   /** 
  204.    * 获得用户资料,根据自己的情况读取数据库 
  205.    */ 
  206.   protected function getUserInfo($uid) { 
  207.     static $userinfo=array(); 
  208.     if(!isset($userinfo[$uid])){ 
  209.        $userinfo[$uid]=\think\Db::name($this->_config['auth_user'])->where(array('aid'=>$uid))->find(); 
  210.     } 
  211.     return $userinfo[$uid]; 
  212.   } 

Auth.php放在extend下面的auth目录里,命名空间为auth

然后在使用的控制器中使用构造方法,或者继承一个使用了构造方法的控制器,构造方法如下:

  1. public function _initialize() 
  2.     $aid = 1; 
  3.     $auth = new \auth\Auth(); 
  4.     $request = Request::instance(); 
  5.     $au = $auth->check($request->module() . '/' . $request->controller() . '/' . $request->action(), $aid); 
  6.     if (!$au) {// 第一个参数是规则名称,第二个参数是用户UID 
  7.       /* return array('status'=>'error','msg'=>'有权限!');*/ 
  8.       $this->error('你没有权限'); 
  9.     } 

上面的$aid应该是用户登录以后获取的,正常情况下应该是session()获取的用户id

相关业务逻辑可以自行判断,剩下的就是添加全县,用户组添加啊,等等系列增删改查了。

Tags: auth权限控制类

分享到: