thinkPHP5 ACL用户权限模块用法详解


Posted in PHP onMay 10, 2017

本文实例讲述了thinkPHP5 ACL用户权限模块用法。分享给大家供大家参考,具体如下:

最近学习thinkphp5,和以前3.X版本是完全不是一个概念。学习thinkphp5的朋友要注意命名空间思想。

最近做的一个项目,一个检测管理系统,由于为了以后做APP需要,才切换到thinkphp5作为以后的扩展API用的。今天完成的是用户权限控制模块。我把这个mark下来

数据库:

role数据库表:

`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL COMMENT '角色名称',
`pid` smallint(6) DEFAULT NULL COMMENT '父角色ID',
`rule_name` text COMMENT '规则唯一英文标识,全小写',
`type` varchar(50) DEFAULT '' COMMENT '权限规则分类,请加应用前缀,如admin_',
`status` tinyint(1) unsigned DEFAULT NULL COMMENT '状态',
`remark` varchar(255) DEFAULT NULL COMMENT '备注',
`create_time` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',
`update_time` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '更新时间',
`listorder` int(3) NOT NULL DEFAULT '0' COMMENT '排序字段',

auth_rule数据库表:

`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT COMMENT '规则id,自增主键',
`module` varchar(20) NOT NULL COMMENT '规则所属module',
`type` varchar(30) NOT NULL DEFAULT '1' COMMENT '权限规则分类,请加应用前缀,如admin_',
`name` varchar(255) NOT NULL DEFAULT '' COMMENT '规则唯一英文标识,全小写',
`param` varchar(255) DEFAULT NULL COMMENT '额外url参数',
`title` varchar(20) NOT NULL DEFAULT '' COMMENT '规则中文描述',
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否有效(0:无效,1:有效)',
`condition` varchar(300) NOT NULL DEFAULT '' COMMENT '规则附加条件',

用户表里面增加:

`pools` varchar(20) DEFAULT '' COMMENT '权限池',
`roleId` smallint(5) NOT NULL DEFAULT '0' COMMENT '权限id',

代码如下:

iAuth.php 权限认证的公共库文件

class iAuth{
  public $user = null;
  //默认配置
  protected $_config = array(
  );
  public function __construct() {
  }
  /**
   * 检查权限
   * @param name string|array 需要验证的规则列表,支持逗号分隔的权限规则或索引数组
   * @param uid int      认证用户的id
   * @param relation string  如果为 'or' 表示满足任一条规则即通过验证;如果为 'and'则表示需满足所有规则才能通过验证
   * @return boolean      通过验证返回true;失败返回false
   */
  public function check($uid,$name,$relation='or') {
    if(empty($uid)){
      return false;
    }
    if($uid==1){
      return true;
    }
    if (is_string($name)) {
      $name = strtolower($name);
      if (strpos($name, ',') !== false) {
        $name = explode(',', $name);
      } else {
        $name = array($name);
      }
    }
    $list = array(); //保存验证通过的规则名
    //获取用户信息
    $this->getUserInfo($uid);//获取用户信息,一维数组
    $groups= $this->user['roleId'];
    if(in_array(1, $groups)){
      return true;
    }
    if(empty($groups)){
      return false;
    }
    $rules = self::get_rules($this->user['roleId']);
    if(in_array($name,$rules))
    {
      return true;
    }
    return false;
  }
  /**
   * 获得用户资料
   */
  private function getUserInfo(&$uid) {
    if(!isset($this->user)){
      $user = new Users($uid);
      $this->user = $user->fields;
    }
    return $this->user;
  }
  /**
   * 获取验证规则
   * @param int $id
   */
  public static function get_rules($id)
  {
    if(empty($id)) return false;
    $rules = Cache::get(self::$cache_prefix . $id);
    if(empty($rules))
    {
      $model = Db::name('role');
      $model->where('id',$id);
      $rules = $model->find();
      $rules['rule_name'] = explode(',',strtolower($rules['rule_name']));
      //设置缓存
      Cache::set(self::$cache_prefix,$rules);
    }
    return $rules;
  }
}

Common.php 通用函数类库

/**
 * 检测用户id
 * @param name string|array 需要验证的规则列表,支持逗号分隔的权限规则或索引数组
 * @param uid int      认证用户的id
 */
function sp_auth_check($uid, $name=null)
{
  if(empty($uid)) return false;
  if(empty($name)){
    $name=strtolower(MODULE_NAME."/".CONTROLLER_NAME."/".ACTION_NAME);
  }
  $iAuth_obj = new \app\Common\Lib\iAuth();
  return $iAuth_obj->check($uid);
}

AdminbaseController.php 后台管理的父控制器类

class AdminbaseController extends Controller
{
  public $uid = 0;
  //用户实例
  public $userObj = null;
  /**
   * 构造函数
   * Adminbase constructor.
   */
  public function __construct()
  {
    parent::__construct();
  }
  public function _initialize()
  {
    $this->uid = Session::read('AdminId');
    if(!empty($this->uid ))
    {
      //检测过已经登录了
      $this->userObj = Db::name('users')->where('uid',$this->uid)->find();
      if(!$this->check_access($this->uid))
      {
        $this->error("您没有访问权限!",Url::build('admin/index/login'));
        exit();
      }
      $this->assign('admin',$this->userObj);
    }
    else
    {
      //没有登录的
      $this->error("您还没有登录!",Url::build('admin/index/login'));
      exit();
    }
  }
  /**
   * 检测权限
   * @param $uid
   */
  private function check_access(&$uid)
  {
    if($uid == 1)
    {
      //超级管理员
      return true;
    }
    $request = Request::instance();
    //如果不是这个应用池的账户也不通过
    $pools = explode(',',$this->userObj['pools']);
    if(!in_array(strtolower($request->module()), $pools))  return false;
    $rule = $request->module() . '_' . $request->controller() . '_' . $request->action() ;
    $no_need_check_rules = Config::get('inc_auth.no_need_check_rules');
    if(!in_array(strtolower($rule),$no_need_check_rules))
    {
      //验证权限
      return sp_auth_check($uid);
    }
    else
    {
      return true;
    }
  }
}

inc_auth.php 认证配置文件

$config['no_need_check_rules'] = array('admin_index_index','admin_index_login');

希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。

PHP 相关文章推荐
PHP实现采集程序原理和简单示例代码
Mar 18 PHP
通达OA公共代码 php常用检测函数
Dec 14 PHP
如何在php中正确的使用json
Aug 06 PHP
php生成随机字符串可指定纯数字、纯字母或者混合的
Apr 18 PHP
destoon实现商铺管理主页设置增加新菜单的方法
Jun 26 PHP
php中session与cookie的比较
Jan 27 PHP
php+html5基于websocket实现聊天室的方法
Jul 17 PHP
用php代码限制国内IP访问我们网站
Sep 26 PHP
thinkPHP多表查询及分页功能实现方法示例
Jul 03 PHP
php框架CodeIgniter使用redis的方法分析
Apr 13 PHP
PHP中单例模式的使用场景与使用方法讲解
Mar 18 PHP
php设计模式之工厂方法模式分析【星际争霸游戏案例】
Jan 23 PHP
使用WAMP搭建PHP本地开发环境
May 10 #PHP
thinkPHP5 tablib标签库自定义方法详解
May 10 #PHP
PHP实现获取第一个中文首字母并进行排序的方法
May 09 #PHP
php7 安装yar 生成docker镜像
May 09 #PHP
php简单生成一组与多组随机字符串的方法
May 09 #PHP
PHP实现上传多图即时显示与即时删除的方法
May 09 #PHP
Laravel中如何增加自定义全局函数详解
May 09 #PHP
You might like
php设计模式 DAO(数据访问对象模式)
2011/06/26 PHP
PHP获取MSN好友列表类的实现代码
2013/06/23 PHP
php一次性删除前台checkbox多选内容的方法
2013/09/22 PHP
Yii中实现处理前后台登录的新方法
2015/12/28 PHP
YII视图整合kindeditor扩展的方法
2016/07/13 PHP
PHP的垃圾回收机制代码实例讲解
2021/02/27 PHP
一个用js实现的页内搜索代码
2007/05/23 Javascript
经常用的图片在容器中的水平垂直居中实例
2007/06/10 Javascript
点击按钮或链接不跳转只刷新页面的脚本整理
2013/10/22 Javascript
jQuery选择器全面总结
2014/01/06 Javascript
jquery实现图片上传之前预览的方法
2015/07/11 Javascript
javascript实现网页背景烟花效果的方法
2015/08/06 Javascript
js获取本机操作系统类型的两种方法
2015/12/19 Javascript
AngularJS自定义插件实现网站用户引导功能示例
2016/11/07 Javascript
利用Js的console对象,在控制台打印调式信息测试Js的实现
2016/11/26 Javascript
从零开始学习Node.js系列教程之基于connect和express框架的多页面实现数学运算示例
2017/04/13 Javascript
React优化子组件render的使用
2019/05/12 Javascript
vuejs移动端实现div拖拽移动
2019/07/25 Javascript
微信小程序通过一个json实现分享朋友圈图片
2019/09/03 Javascript
echarts.js 动态生成多个图表 使用vue封装组件操作
2020/07/19 Javascript
Openlayers实现地图全屏显示
2020/09/28 Javascript
JS相册图片抖动放大展示效果的示例代码
2021/01/29 Javascript
Python解惑之整数比较详解
2017/04/24 Python
python多进程和多线程究竟谁更快(详解)
2017/05/29 Python
Python机器学习k-近邻算法(K Nearest Neighbor)实例详解
2018/06/25 Python
python 随机打乱 图片和对应的标签方法
2018/12/14 Python
python初学者,用python实现基本的学生管理系统(python3)代码实例
2019/04/10 Python
2021年的Python 时间轴和即将推出的功能详解
2020/07/27 Python
matplotlib交互式数据光标实现(mplcursors)
2021/01/13 Python
美体小铺法国官方网站:The Body Shop法国
2020/06/04 全球购物
低碳生活倡议书
2014/04/14 职场文书
2014年网络管理员工作总结
2014/12/01 职场文书
慰问信格式
2015/02/14 职场文书
赵氏孤儿观后感
2015/06/09 职场文书
优质服务标语口号
2015/12/26 职场文书
游戏《东方异文石:爱亚利亚黎明》正式版发布
2022/04/03 其他游戏