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 array的学习笔记
May 10 PHP
php调用google接口生成二维码示例
Apr 28 PHP
php实例分享之html转为rtf格式
Jun 02 PHP
PHP结合JQueryJcrop实现图片裁切实例详解
Jul 24 PHP
PHP实现更新中间关联表数据的两种方法
Sep 01 PHP
自定义session存储机制避免会话保持问题
Oct 08 PHP
php发送与接收流文件的方法
Feb 11 PHP
php自定义urlencode,urldecode函数实例
Mar 24 PHP
PHP中strcmp()和strcasecmp()函数字符串比较用法分析
Jan 07 PHP
PHP5.3新特性小结
Feb 14 PHP
Laravel中encrypt和decrypt的实现方法
Sep 24 PHP
Yii2框架配置文件(Application属性)与调试技巧实例分析
May 27 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自动更新新闻DIY
2006/10/09 PHP
php smarty的预保留变量总结
2008/12/04 PHP
smarty模板引擎中自定义函数的方法
2015/01/22 PHP
php中文字符串截取多种方法汇总
2016/10/06 PHP
php实现生成code128条形码的方法详解
2017/07/19 PHP
PHP验证类的封装与使用方法详解
2019/01/10 PHP
深入理解jQuery之防止冒泡事件
2016/05/24 Javascript
浅谈JavaScript中数组的增删改查
2016/06/20 Javascript
JavaScript每天必学之数组和对象部分
2016/09/17 Javascript
JS只能输入正整数的简单实例
2016/10/07 Javascript
JavaScript 过滤关键字
2017/03/20 Javascript
jQuery层级选择器_动力节点节点Java学院整理
2017/07/04 jQuery
jQuery实现的粘性滚动导航栏效果实例【附源码下载】
2017/10/19 jQuery
微信小程序基于本地缓存实现点赞功能的方法
2017/12/18 Javascript
Python 基础之字符串string详解及实例
2017/04/01 Python
python获取指定时间差的时间实例详解
2017/04/11 Python
Python高级用法总结
2018/05/26 Python
python使用turtle绘制分形树
2018/06/22 Python
python按比例随机切分数据的实现
2019/07/11 Python
Django缓存系统实现过程解析
2019/08/02 Python
django框架用户权限中的session缓存到redis中的方法
2019/08/06 Python
浅谈Pytorch中的自动求导函数backward()所需参数的含义
2020/02/29 Python
Python环境下安装PyGame和PyOpenGL的方法
2020/03/25 Python
django haystack实现全文检索的示例代码
2020/06/24 Python
Python Pivot table透视表使用方法解析
2020/09/11 Python
澳大利亚最好的厨具店:Kitchen Warehouse
2018/03/13 全球购物
全球烹饪课程的领先预订平台:Cookly
2020/01/28 全球购物
八一建军节部队活动方案
2014/02/04 职场文书
机关办公室岗位职责
2014/04/16 职场文书
大专学生求职自荐信
2014/07/06 职场文书
民事授权委托书范文
2014/08/02 职场文书
小学六一主持词开场白
2015/05/28 职场文书
幼儿园迎新生欢迎词
2015/09/30 职场文书
Java实战之用Swing实现通讯录管理系统
2021/06/13 Java/Android
浅谈自定义校验注解ConstraintValidator
2021/06/30 Java/Android
python中mongodb包操作数据库
2022/04/19 Python