BVB Source Codes

The latest thinkphp v5.2 work order system Show Auth.class.php Source code

Return Download The latest thinkphp v5.2 work order system: download Auth.class.php Source code - Download The latest thinkphp v5.2 work order system Source code - Type:.php
  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 Think;
  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. -- ----------------------------
  29. -- think_auth_rule,规则表,
  30. -- id:主键,name:规则唯一标识, title:规则中文名称 status 状态:为1正常,为0禁用,condition:规则表达式,为空表示存在就验证,不为空表示按照条件验证
  31. -- ----------------------------
  32.  DROP TABLE IF EXISTS `think_auth_rule`;
  33. CREATE TABLE `think_auth_rule` (  
  34.     `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,  
  35.     `name` char(80) NOT NULL DEFAULT '',  
  36.     `title` char(20) NOT NULL DEFAULT '',  
  37.     `type` tinyint(1) NOT NULL DEFAULT '1',    
  38.     `status` tinyint(1) NOT NULL DEFAULT '1',  
  39.     `condition` char(100) NOT NULL DEFAULT '',  # 规则附件条件,满足附加条件的规则,才认为是有效的规则
  40.     PRIMARY KEY (`id`),  
  41.     UNIQUE KEY `name` (`name`)
  42. ) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
  43. -- ----------------------------
  44. -- think_auth_group 用户组表,
  45. -- id:主键, title:用户组中文名称, rules:用户组拥有的规则id, 多个规则","隔开,status 状态:为1正常,为0禁用
  46. -- ----------------------------
  47.  DROP TABLE IF EXISTS `think_auth_group`;
  48. CREATE TABLE `think_auth_group` (
  49.     `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
  50.     `title` char(100) NOT NULL DEFAULT '',
  51.     `status` tinyint(1) NOT NULL DEFAULT '1',
  52.     `rules` char(80) NOT NULL DEFAULT '',
  53.     PRIMARY KEY (`id`)
  54. ) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
  55. -- ----------------------------
  56. -- think_auth_group_access 用户组明细表
  57. -- uid:用户id,group_id:用户组id
  58. -- ----------------------------
  59. DROP TABLE IF EXISTS `think_auth_group_access`;
  60. CREATE TABLE `think_auth_group_access` (  
  61.     `uid` mediumint(8) unsigned NOT NULL,  
  62.     `group_id` mediumint(8) unsigned NOT NULL,
  63.     UNIQUE KEY `uid_group_id` (`uid`,`group_id`),  
  64.     KEY `uid` (`uid`),
  65.     KEY `group_id` (`group_id`)
  66. ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
  67.  */
  68.  
  69. class Auth{
  70.  
  71.     //默认配置
  72.     protected $_config = array(
  73.         'AUTH_ON'           => true,                      // 认证开关
  74.         'AUTH_TYPE'         => 1,                         // 认证方式,1为实时认证;2为登录认证。
  75.         'AUTH_GROUP'        => 'auth_group',        // 用户组数据表名
  76.         'AUTH_GROUP_ACCESS' => 'auth_group_access', // 用户-用户组关系表
  77.         'AUTH_RULE'         => 'auth_rule',         // 权限规则表
  78.         'AUTH_USER'         => 'member'             // 用户信息表
  79.     );
  80.  
  81.     public function __construct() {
  82.         $prefix = C('DB_PREFIX');
  83.         $this->_config['AUTH_GROUP'] = $prefix.$this->_config['AUTH_GROUP'];
  84.         $this->_config['AUTH_RULE'] = $prefix.$this->_config['AUTH_RULE'];
  85.         $this->_config['AUTH_USER'] = $prefix.$this->_config['AUTH_USER'];
  86.         $this->_config['AUTH_GROUP_ACCESS'] = $prefix.$this->_config['AUTH_GROUP_ACCESS'];
  87.         if (C('AUTH_CONFIG')) {
  88.             //可设置配置项 AUTH_CONFIG, 此配置项为数组。
  89.             $this->_config = array_merge($this->_config, C('AUTH_CONFIG'));
  90.         }
  91.     }
  92.  
  93.     /**
  94.       * 检查权限
  95.       * @param name string|array  需要验证的规则列表,支持逗号分隔的权限规则或索引数组
  96.       * @param uid  int           认证用户的id
  97.       * @param string mode        执行check的模式
  98.       * @param relation string    如果为 'or' 表示满足任一条规则即通过验证;如果为 'and'则表示需满足所有规则才能通过验证
  99.       * @return boolean           通过验证返回true;失败返回false
  100.      */
  101.     public function check($name, $uid, $type=1, $mode='url', $relation='or') {
  102.         if (!$this->_config['AUTH_ON'])
  103.             return true;
  104.         $authList = $this->getAuthList($uid,$type); //获取用户需要验证的所有有效规则列表
  105.         if (is_string($name)) {
  106.             $name = strtolower($name);
  107.             if (strpos($name, ',') !== false) {
  108.                 $name = explode(',', $name);
  109.             } else {
  110.                 $name = array($name);
  111.             }
  112.         }
  113.         $list = array(); //保存验证通过的规则名
  114.         if ($mode=='url') {
  115.             $REQUEST = unserialize( strtolower(serialize($_REQUEST)) );
  116.         }
  117.         foreach ( $authList as $auth ) {
  118.             $query = preg_replace('/^.+\?/U','',$auth);
  119.             if ($mode=='url' && $query!=$auth ) {
  120.                 parse_str($query,$param); //解析规则中的param
  121.                 $intersect = array_intersect_assoc($REQUEST,$param);
  122.                 $auth = preg_replace('/\?.*$/U','',$auth);
  123.                 if ( in_array($auth,$name) && $intersect==$param ) {  //如果节点相符且url参数满足
  124.                     $list[] = $auth ;
  125.                 }
  126.             }else if (in_array($auth , $name)){
  127.                 $list[] = $auth ;
  128.             }
  129.         }
  130.         if ($relation == 'or' and !empty($list)) {
  131.             return true;
  132.         }
  133.         $diff = array_diff($name, $list);
  134.         if ($relation == 'and' and empty($diff)) {
  135.             return true;
  136.         }
  137.         return false;
  138.     }
  139.  
  140.     /**
  141.      * 根据用户id获取用户组,返回值为数组
  142.      * @param  uid int     用户id
  143.      * @return array       用户所属的用户组 array(
  144.      *     array('uid'=>'用户id','group_id'=>'用户组id','title'=>'用户组名称','rules'=>'用户组拥有的规则id,多个,号隔开'),
  145.      *     ...)  
  146.      */
  147.     public function getGroups($uid) {
  148.         static $groups = array();
  149.         if (isset($groups[$uid]))
  150.             return $groups[$uid];
  151.         $user_groups = M()
  152.             ->table($this->_config['AUTH_GROUP_ACCESS'] . ' a')
  153.             ->where("a.uid='$uid' and g.status='1'")
  154.             ->join($this->_config['AUTH_GROUP']." g on a.group_id=g.id")
  155.             ->field('uid,group_id,title,rules')->select();
  156.         $groups[$uid]=$user_groups?:array();
  157.         return $groups[$uid];
  158.     }
  159.  
  160.     /**
  161.      * 获得权限列表
  162.      * @param integer $uid  用户id
  163.      * @param integer $type
  164.      */
  165.     protected function getAuthList($uid,$type) {
  166.         static $_authList = array(); //保存用户验证通过的权限列表
  167.         $t = implode(',',(array)$type);
  168.         if (isset($_authList[$uid.$t])) {
  169.             return $_authList[$uid.$t];
  170.         }
  171.         if( $this->_config['AUTH_TYPE']==2 && isset($_SESSION['_AUTH_LIST_'.$uid.$t])){
  172.             return $_SESSION['_AUTH_LIST_'.$uid.$t];
  173.         }
  174.  
  175.         //读取用户所属用户组
  176.         $groups = $this->getGroups($uid);
  177.         $ids = array();//保存用户所属用户组设置的所有权限规则id
  178.         foreach ($groups as $g) {
  179.             $ids = array_merge($ids, explode(',', trim($g['rules'], ',')));
  180.         }
  181.         $ids = array_unique($ids);
  182.         if (empty($ids)) {
  183.             $_authList[$uid.$t] = array();
  184.             return array();
  185.         }
  186.  
  187.         $map=array(
  188.             'id'=>array('in',$ids),
  189.             'type'=>$type,
  190.             'status'=>1,
  191.         );
  192.         //读取用户组所有权限规则
  193.         $rules = M()->table($this->_config['AUTH_RULE'])->where($map)->field('condition,name')->select();
  194.  
  195.         //循环规则,判断结果。
  196.         $authList = array();   //
  197.         foreach ($rules as $rule) {
  198.             if (!empty($rule['condition'])) { //根据condition进行验证
  199.                 $user = $this->getUserInfo($uid);//获取用户信息,一维数组
  200.  
  201.                 $command = preg_replace('/\{(\w*?)\}/', '$user[\'\\1\']', $rule['condition']);
  202.                 //dump($command);//debug
  203.                 @(eval('$condition=(' . $command . ');'));
  204.                 if ($condition) {
  205.                     $authList[] = strtolower($rule['name']);
  206.                 }
  207.             } else {
  208.                 //只要存在就记录
  209.                 $authList[] = strtolower($rule['name']);
  210.             }
  211.         }
  212.         $_authList[$uid.$t] = $authList;
  213.         if($this->_config['AUTH_TYPE']==2){
  214.             //规则列表结果保存到session
  215.             $_SESSION['_AUTH_LIST_'.$uid.$t]=$authList;
  216.         }
  217.         return array_unique($authList);
  218.     }
  219.  
  220.     /**
  221.      * 获得用户资料,根据自己的情况读取数据库
  222.      */
  223.     protected function getUserInfo($uid) {
  224.         static $userinfo=array();
  225.         if(!isset($userinfo[$uid])){
  226.              $userinfo[$uid]=M()->where(array('uid'=>$uid))->table($this->_config['AUTH_USER'])->find();
  227.         }
  228.         return $userinfo[$uid];
  229.     }
  230.  
  231. }
  232.  
downloadAuth.class.php Source code - Download The latest thinkphp v5.2 work order system Source code
Related Source Codes/Software:
V3.3.6 Workerman high-performance PHP Socket (framework) - High performance PHP Socket framework Workerman re... 2017-05-03
The phosphor meeting room reservation system MRBS (loop reservation v16.0) - The phosphor meeting room reservation system MRBS ... 2017-05-03
IDC v5.2.3 agent center - IDC Centre IDC for exploitation is a PHP+MySQL age... 2017-05-03
Zen master v9.0.1 project management software - Zen is the first domestic open source project mana... 2017-05-03
Ray speed v7.03 employee files management system - Employee files project is various, and some conten... 2017-05-03
HITCMS Haitian responsive electronic mechanical v3.0 foreign trade website source code - HITCMS Haitian response electronic machinery trade... 2017-05-03
Ray v7.02 speed survey system - Lightning speed survey system is a. NET+MSSQL deve... 2017-05-03
Cool HITCMS reactive black v3.0 enterprise website source code - HITCMS-Haitian response black enterprises website ... 2017-05-03
WebOA v17.2 network office automation system - WebOA network using b/s structure development of o... 2017-05-03
Pure imitation of han site source code, one a 】 【 c9cms kernel v1.0 - Generic http://www.wufazhuce.com/Han one · Config... 2017-05-04
zone.js - Implements Zones for JavaScript ... 2017-05-11
dragonfly - A Ruby gem for on-the-fly processing - suitable fo... 2017-05-11
oh-my-fish - The Fishshell Framework. 2017-05-11
canvas-lms - The open LMS by Instructure, Inc. 2017-05-11
ledger - Double-entry accounting system with a command-line... 2017-05-11
Python - My Python Examples http://w... 2017-05-11
blade - 2017-05-11
LaZagne - Credentials recovery project 2017-05-10
Pull-to-Refresh.Rentals-iOS - This project aims to provide a simple and customiz... 2017-05-10
spoon - Distributing instrumentation tests to all your And... 2017-05-10

 Back to top