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 相关文章推荐
Linux fgetcsv取得的数组元素为空字符串的解决方法
Nov 25 PHP
关于二级目录拖拽排序的实现(源码示例下载)
Apr 26 PHP
一个php短网址的生成代码(仿微博短网址)
May 07 PHP
PHP实现图片裁剪、添加水印效果代码
Oct 01 PHP
php限制ip地址范围的方法
Mar 31 PHP
php基础教程
Aug 26 PHP
php实现word转html的方法
Jan 22 PHP
PHP sleep()函数, usleep()函数
Aug 25 PHP
PHP上传Excel文件导入数据到MySQL数据库示例
Oct 25 PHP
PHP实现根据数组的值进行分组的方法
Apr 20 PHP
PHP实现防止表单重复提交功能【基于token验证】
May 24 PHP
php解压缩zip和rar压缩包文件的方法
Jul 10 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
phplot生成图片类用法详解
2015/01/06 PHP
thinkphp制作404跳转页的简单实现方法
2016/09/22 PHP
PHP基于GD库的图像处理方法小结
2016/09/27 PHP
php+mysql+ajax实现单表多字段多关键词查询的方法
2017/04/15 PHP
Laravel 不同生产环境服务器的判断实践
2019/10/15 PHP
PHP设计模式(八)装饰器模式Decorator实例详解【结构型】
2020/05/02 PHP
JS控件autocomplete 0.11演示及下载 1月5日已更新
2007/01/09 Javascript
JavaScript asp.net 获取当前超链接中的文本
2009/04/14 Javascript
SharePoint 客户端对象模型 (一) ECMA Script
2011/05/22 Javascript
jquery配合css简单实现返回顶部效果
2013/09/30 Javascript
jquery创建表格(自动增加表格)代码分享
2013/12/25 Javascript
JavaScript中的console.assert()函数介绍
2014/12/29 Javascript
js实现简单div拖拽功能实例
2015/05/12 Javascript
jquery实现加载进度条提示效果
2015/11/23 Javascript
JavaScript浏览器对象之一Window对象详解
2016/06/03 Javascript
任意Json转成无序列表的方法示例
2016/12/09 Javascript
js实现模糊匹配功能
2017/02/15 Javascript
js实现3d悬浮效果
2017/02/16 Javascript
JS去掉字符串前后空格、阻止表单提交的实现代码
2017/06/08 Javascript
Angular数据绑定机制原理
2018/04/17 Javascript
Vue验证码60秒倒计时功能简单实例代码
2018/06/22 Javascript
更改BootStrap popover的默认样式及popover简单用法
2018/09/13 Javascript
微信小程序获取当前时间及星期几的实例代码
2020/09/20 Javascript
Python处理JSON时的值报错及编码报错的两则解决实录
2016/06/26 Python
深入理解Python分布式爬虫原理
2017/11/23 Python
python实现百万答题自动百度搜索答案
2018/01/16 Python
python通过tcp发送xml报文的方法
2018/12/28 Python
对python 树状嵌套结构的实现思路详解
2019/08/09 Python
Python中的上下文管理器相关知识详解
2019/09/19 Python
Python实现在线批量美颜功能过程解析
2020/06/10 Python
Looking4Parking美国:全球排名第一的机场停车比较品牌
2019/08/26 全球购物
大学新生军训个人的自我评价
2013/10/03 职场文书
中专生自我鉴定范文
2014/02/02 职场文书
青春励志演讲稿范文
2014/08/25 职场文书
2015年财政局工作总结
2015/05/21 职场文书
2016父亲节感恩话语
2015/12/09 职场文书