thinkphp 节点权限认证类 和Rbac,Auth认证差不多

thinkphp 节点权限认证类 和Rbac,Auth认证差不多   暂不公布控制器逻辑代码 详细的可以联系 大神有时间也可以给我指点一下设计的不足之处


================筹备计划=================


2017年5月11日13:19:24--------------------------------------

1.更新tp5使用demo


================更新记录=================


2017年5月8日13:19:11 ---------------------------------------

1.完成最后项目测试





<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016 一讯 All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: 一讯 <weibo.com/qipengzhao> 
// +----------------------------------------------------------------------
namespace Org\Util;
/**
 * 完美权限 最大节点权限
 * 祁鹏钊 QQ915836796
 */
/**
 * 完美权限认证类
 * 功能特性:
 * 1,是对节点进行认证。可以拓展
 *      $maxauth = new \Org\Util\MaxAuth();  $maxauth->check('节点id或者规则名称','用户id/用户的唯一标示')
 * 2,获取用户所属用户组。连带用户信息返回
 *      $maxauth = new \Org\Util\MaxAuth();  $maxauth->getGroups('用户id')
 * 3,获取用户所有可操作节点。
 *      $maxauth = new \Org\Util\MaxAuth();  $maxauth->getAuthList('用户id','所属分组 暂时不使用')
 */

//数据库
/*
-- -----------------------------------------------------
-- Table `qc_maxauth_admin`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `qc_maxauth_admin` (
  `admin_id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '用户id',
  `admin_name` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '用户名',
  `admin_password` VARCHAR(40) NOT NULL DEFAULT '' COMMENT '密码',
  `admin_authority` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '用户权限',
  `admin_type` TINYINT NOT NULL DEFAULT 1 COMMENT '用户类型  1为技术部 2为运营部 3为人事 4为 全部',
  `admin_islock` TINYINT NOT NULL DEFAULT 1 COMMENT '用户状态 1为正常 2为停职',
  `admin_work` VARCHAR(45) NOT NULL DEFAULT '' COMMENT '职务 ',
  `admin_time` INT NOT NULL DEFAULT 0 COMMENT '时间',
  `admin_phone` VARCHAR(45) NOT NULL DEFAULT '',
  PRIMARY KEY (`admin_id`))
ENGINE = MyISAM
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_unicode_ci
COMMENT = '后台用户信息表 MAXAUTH权限';


-- -----------------------------------------------------
-- Table `qc_maxauth_group`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `qc_maxauth_group` (
  `group_id` INT NOT NULL AUTO_INCREMENT COMMENT '用户组id',
  `group_name` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '用户组名字',
  `group_time` INT NOT NULL DEFAULT 0 COMMENT '修改时间',
  PRIMARY KEY (`group_id`))
ENGINE = MyISAM
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_unicode_ci
COMMENT = '后台 用户组 MAXAUTH权限';


-- -----------------------------------------------------
-- Table `qc_maxauth_rule`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `qc_maxauth_rule` (
  `rule_id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '权限节点id',
  `rule_name` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '权限节点名称',
  `rule_time` INT NOT NULL DEFAULT 0 COMMENT '更新时间',
  PRIMARY KEY (`rule_id`))
ENGINE = MyISAM
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_unicode_ci
COMMENT = '后台 权限节点 MAXAUTH权限';


-- -----------------------------------------------------
-- Table `qc_maxauth_group_access`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `qc_maxauth_group_access` (
  `access_id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '关系id',
  `rule_rule_id` INT NOT NULL DEFAULT 0 COMMENT '节点id',
  `group_group_id` INT NOT NULL DEFAULT 0 COMMENT '分组id',
  `access_time` INT NOT NULL DEFAULT 0 COMMENT '生成时间',
  PRIMARY KEY (`access_id`))
ENGINE = MyISAM
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_unicode_ci
COMMENT = '后台 权限关系表 	 MAXAUTH权限';
 */

class MaxAuth{

    //默认配置
    protected $_config = array(
        'MAXAUTH_ON'           => true,                      // 认证开关
        'MAXAUTH_TYPE'         => 1,                         // 认证方式,1为实时认证;2为登录认证。
        'MAXAUTH_GROUP'        => 'maxauth_group',        // 用户组数据表名
        'MAXAUTH_GROUP_ACCESS' => 'maxauth_group_access', // 权限-用户组关系表
        'MAXAUTH_RULE'         => 'maxauth_rule',         // 权限规则表
        'MAXAUTH_USER'         => 'maxauth_admin'             // 用户信息表
    );
	
	// 整理权限所需配置
    public function __construct() {
        $prefix = C('DB_PREFIX');
        $this->_config['MAXAUTH_GROUP'] = $prefix.$this->_config['MAXAUTH_GROUP'];
        $this->_config['MAXAUTH_RULE'] = $prefix.$this->_config['MAXAUTH_RULE'];
        $this->_config['MAXAUTH_USER'] = $prefix.$this->_config['MAXAUTH_USER'];
        $this->_config['MAXAUTH_GROUP_ACCESS'] = $prefix.$this->_config['MAXAUTH_GROUP_ACCESS'];
        if (C('MAXAUTH_CONFIG')) {
            //可设置配置项 MAXAUTH_CONFIG, 此配置项为数组。
            $this->_config = array_merge($this->_config, C('MAXAUTH_CONFIG'));
        }
    }
	

    /**
      * 检查权限
      * @param rule string  需要验证的权限节点
      * @param uid  int           认证用户的id
      * @return boolean           通过验证返回true;失败返回false
     */
    public function check($rule,$uid) {
        if (!$this->_config['MAXAUTH_ON'])
            return true;
        $groups = $this->getGroups($uid); //获取用户需要验证的节点数据
        
        if (empty($groups['admin_authority'])) {
            return false;
        } 

        $map=array(
            'group_group_id'=>array('in',$groups['admin_authority']),
            'rule_rule_id'=>array('eq',$rule),
        );
        //读取用户组所有权限规则
        $rules = M()->table($this->_config['MAXAUTH_GROUP_ACCESS'])->where($map)->find();
		
        if ($rules) {
            return true;
        }
        return false;
    }

    /**
     * 根据用户id获取用户组,返回值为数组
     * @param  uid int     用户id
     * @return array       用户所属的用户组 
     */
    public function getGroups($uid) {
        static $groups = array();
        if (isset($groups[$uid]))
            return $groups[$uid];
		// 查询用户所属用户组
		$user_admin = M()
			->table($this->_config['MAXAUTH_USER'])
			->where("admin_id='$uid'")
			->find();
		$groups[$uid]=$user_admin?:array();
		return $groups[$uid];
    }

    /**
     * 获得权限列表
     * @param integer $uid  用户id
     * @param integer $group 用户所属分组 
     */
    public function getAuthList($uid,$group = 1) {
        static $_authList = array(); //保存用户验证通过的权限列表
       
        if( $this->_config['MAXAUTH_TYPE']==2 && isset($_SESSION['_AUTH_LIST_'.$uid])){
            return $_SESSION['_AUTH_LIST_'.$uid];
        }

        //读取用户所属用户组
        $groups = $this->getGroups($uid);
        
        if (empty($groups['admin_authority'])) {
            $_authList[$uid.$t] = array();
            return array();
        } 

        $map=array(
            'group_group_id'=>array('in',$groups['admin_authority']),
        );
        //读取用户组所有权限规则
        $rules = M()->table($this->_config['MAXAUTH_GROUP_ACCESS'])->where($map)->field('group_group_id,rule_rule_id')->select();
		
        //循环规则,判断结果。
        $authList = array();   //
        foreach ($rules as $rule) {
            if (!empty($rule['rule_rule_id'])) {
                $authList[$rule['rule_rule_id']] = strtolower($rule['rule_rule_id']);
                
            }
        }
//		return $authList;
//		$authList = array_values($authList);
        $_authList[$uid] = $authList;
        if($this->_config['MAXAUTH_TYPE']==2){
            //规则列表结果保存到session
            $_SESSION['_AUTH_LIST_'.$uid]=$authList;
        }
        return array_unique($authList);
    }

    /**
     * 获得用户资料,根据自己的情况读取数据库
     */
    protected function getUserInfo($uid) {
        static $userinfo=array();
        if(!isset($userinfo[$uid])){
             $userinfo[$uid]=M()->where(array('admin_id'=>$uid))->table($this->_config['MAXAUTH_USER'])->find();
        }
        return $userinfo[$uid];
    }

}


尊云CMS
请先登陆后发表评论
  • 最新评论
  • 总共0条评论