tp5Auth权限实现

下面本人为大家讲解一下如何实现auth权限,
第一步,新建Auth.php,复制下面的代码,把注释中的表都创建一下。把文件放到extend新建文件夹org放进去即可,
<?php 
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2011 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: luofei614 <weibo.com/luofei614>
// +----------------------------------------------------------------------
// | 修改者: anuo (本权限类在原3.2.3的基础上修改过来的)
// +----------------------------------------------------------------------
use think\Db;
use think\Config;
use think\Session;
use think\Request;
use think\Loader; /*** 权限认证类* 功能特性:* 1,是对规则进行认证,不是对节点进行认证。用户可以把节点当作规则名称实现对节点进行认证。*      $auth=new Auth();  $auth->check('规则名称','用户id')* 2,可以同时对多条规则进行认证,并设置多条规则的关系(or或者and)*      $auth=new Auth();  $auth->check('规则1,规则2','用户id','and')*      第三个参数为and时表示,用户需要同时具有规则1和规则2的权限。 当第三个参数为or时,表示用户值需要具备其中一个条件即可。默认为or* 3,一个用户可以属于多个用户组(think_auth_group_access表 定义了用户所属用户组)。我们需要设置每个用户组拥有哪些规则(think_auth_group 定义了用户组权限)* 4,支持规则表达式。*      在think_auth_rule 表中定义一条规则时,如果type为1, condition字段就可以定义规则表达式。 如定义{score}>5  and {score}<100* 表示用户的分数在5-100之间时这条规则才会通过。*/
//数据库
/*
-- ----------------------------
-- think_auth_rule,规则表,
-- id:主键,name:规则唯一标识, title:规则中文名称 status 状态:为1正常,为0禁用,condition:规则表达式,为空表示存在就验证,不为空表示按照条件验证
-- ----------------------------
DROP TABLE IF EXISTS `think_auth_rule`;
CREATE TABLE `think_auth_rule` (`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,`name` char(80) NOT NULL DEFAULT '',`title` char(20) NOT NULL DEFAULT '',`type` tinyint(1) NOT NULL DEFAULT '1',`status` tinyint(1) NOT NULL DEFAULT '1',`condition` char(100) NOT NULL DEFAULT '',  # 规则附件条件,满足附加条件的规则,才认为是有效的规则PRIMARY KEY (`id`),UNIQUE KEY `name` (`name`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
-- ----------------------------
-- think_auth_group 用户组表,
-- id:主键, title:用户组中文名称, rules:用户组拥有的规则id, 多个规则","隔开,status 状态:为1正常,为0禁用
-- ----------------------------
DROP TABLE IF EXISTS `think_auth_group`;CREATE TABLE `think_auth_group` (`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,`title` char(100) NOT NULL DEFAULT '',`status` tinyint(1) NOT NULL DEFAULT '1',`rules` char(80) NOT NULL DEFAULT '',PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
-- ----------------------------
-- think_auth_group_access 用户组明细表
-- uid:用户id,group_id:用户组id
-- ----------------------------
DROP TABLE IF EXISTS `think_auth_group_access`;CREATE TABLE `think_auth_group_access` (`uid` mediumint(8) unsigned NOT NULL,`group_id` mediumint(8) unsigned NOT NULL,UNIQUE KEY `uid_group_id` (`uid`,`group_id`),KEY `uid` (`uid`),KEY `group_id` (`group_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;*/class Auth
{/*** @var object 对象实例*/protected static $instance;/*** 当前请求实例* @var Request*/protected $request;//默认配置protected $config = ['auth_on'           => 1, // 权限开关'auth_type'         => 1, // 认证方式,1为实时认证;2为登录认证。'auth_group'        => 'auth_group', // 用户组数据表名'auth_group_access' => 'auth_group_access', // 用户-用户组关系表'auth_rule'         => 'auth_rule', // 权限规则表'auth_user'         => 'member', // 用户信息表];/*** 类架构函数* Auth constructor.*/public function __construct(){//可设置配置项 auth, 此配置项为数组。if ($auth = Config::get('auth')) {$this->config = array_merge($this->config, $auth);}// 初始化request$this->request = Request::instance();}/*** 初始化* @access public* @param array $options 参数* @return \think\Request*/public static function instance($options = []){if (is_null(self::$instance)) {self::$instance = new static($options);}return self::$instance;}/*** 检查权限* @param        $name     string|array  需要验证的规则列表,支持逗号分隔的权限规则或索引数组* @param        $uid      int           认证用户的id* @param int    $type     认证类型* @param string $mode     执行check的模式* @param string $relation 如果为 'or' 表示满足任一条规则即通过验证;如果为 'and'则表示需满足所有规则才能通过验证* @return bool               通过验证返回true;失败返回false*/public function check($name, $uid, $type = 1, $mode = 'url', $relation = 'or'){if (!$this->config['auth_on']) {return true;}// 获取用户需要验证的所有有效规则列表$authList = $this->getAuthList($uid, $type);if (is_string($name)) {$name = strtolower($name);if (strpos($name, ',') !== false) {$name = explode(',', $name);} else {$name = [$name];}}$list = []; //保存验证通过的规则名if ('url' == $mode) {$REQUEST = unserialize(strtolower(serialize($this->request->param())));}foreach ($authList as $auth) {$query = preg_replace('/^.+\?/U', '', $auth);if ('url' == $mode && $query != $auth) {parse_str($query, $param); //解析规则中的param$intersect = array_intersect_assoc($REQUEST, $param);$auth      = preg_replace('/\?.*$/U', '', $auth);if (in_array($auth, $name) && $intersect == $param) {//如果节点相符且url参数满足$list[] = $auth;}} else {if (in_array($auth, $name)) {$list[] = $auth;}}}if ('or' == $relation && !empty($list)) {return true;}$diff = array_diff($name, $list);if ('and' == $relation && empty($diff)) {return true;}return false;}/*** 根据用户id获取用户组,返回值为数组* @param  $uid int     用户id* @return array       用户所属的用户组 array(*              array('uid'=>'用户id','group_id'=>'用户组id','title'=>'用户组名称','rules'=>'用户组拥有的规则id,多个,号隔开'),*              ...)*/public function getGroups($uid){static $groups = [];if (isset($groups[$uid])) {return $groups[$uid];}// 转换表名$auth_group_access = Loader::parseName($this->config['auth_group_access'], 1);$auth_group        = Loader::parseName($this->config['auth_group'], 1);// 执行查询$user_groups  = Db::view($auth_group_access, 'uid,group_id')->view($auth_group, 'title,rules', "{$auth_group_access}.group_id={$auth_group}.id", 'LEFT')->where("{$auth_group_access}.uid='{$uid}' and {$auth_group}.status='1'")->select();$groups[$uid] = $user_groups ?: [];return $groups[$uid];}/*** 获得权限列表* @param integer $uid 用户id* @param integer $type* @return array*/protected function getAuthList($uid, $type){static $_authList = []; //保存用户验证通过的权限列表$t = implode(',', (array)$type);if (isset($_authList[$uid . $t])) {return $_authList[$uid . $t];}if (2 == $this->config['auth_type'] && Session::has('_auth_list_' . $uid . $t)) {return Session::get('_auth_list_' . $uid . $t);}//读取用户所属用户组$groups = $this->getGroups($uid);$ids    = []; //保存用户所属用户组设置的所有权限规则idforeach ($groups as $g) {$ids = array_merge($ids, explode(',', trim($g['rules'], ',')));}$ids = array_unique($ids);if (empty($ids)) {$_authList[$uid . $t] = [];return [];}$map = ['id'   => ['in', $ids],'type' => $type];//读取用户组所有权限规则$rules = Db::name($this->config['auth_rule'])->where($map)->field('condition,name')->select();//循环规则,判断结果。$authList = []; //foreach ($rules as $rule) {if (!empty($rule['condition'])) {//根据condition进行验证$user    = $this->getUserInfo($uid); //获取用户信息,一维数组$command = preg_replace('/\{(\w*?)\}/', '$user[\'\\1\']', $rule['condition']);@(eval('$condition=(' . $command . ');'));if ($condition) {$authList[] = strtolower($rule['name']);}} else {//只要存在就记录$authList[] = strtolower($rule['name']);}}$_authList[$uid . $t] = $authList;if (2 == $this->config['auth_type']) {//规则列表结果保存到sessionSession::set('_auth_list_' . $uid . $t, $authList);}return array_unique($authList);}/*** 获得用户资料* @param $uid* @return mixed*/protected function getUserInfo($uid){static $user_info = [];$user = Db::name($this->config['auth_user']);// 获取用户表主键$_pk = is_string($user->getPk()) ? $user->getPk() : 'uid';if (!isset($user_info[$uid])) {$user_info[$uid] = $user->where($_pk, $uid)->find();}return $user_info[$uid];}
}
第二步 新建控制器,其它的权限添加就不多说了,下面是验证最终结果
<?php
namespace app\admin\controller;
use \think\Controller;
use think\Loader;
class Base extends Controller
{protected $current_action;public function _initialize(){Loader::import("org/Auth", EXTEND_PATH);$auth=new \Auth();$this->current_action = request()->module().'/'.request()->controller().'/'.lcfirst(request()->action());$result = $auth->check($this->current_action,session('user_id'));if($result){echo "权限验证成功";}}
}

欢迎加入php技术交流,资源分享群

加群可获取下面视频一套,有效期至2018/1/30

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/51880.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

科技云报道:大模型的中场战事,深入垂直行业腹地

科技云报道原创。 自从OpenAI于2022年11月推出ChatGPT后&#xff0c;一场波及全球科技界的“AI海啸”就此爆发。 自今年以来&#xff0c;国内已有超过30家企业入局大模型赛道。从百度“文心一言”、阿里“通义千问”的发布&#xff0c;到网易“玉言”、科大讯飞“星火”、昆仑…

美国国会听证会探讨“深度伪造(deepfake)”风险及对策

大数据文摘授权转载自腾讯研究院 作者&#xff1a;曹建峰、方龄曼 近日&#xff0c;一段关于扎克伯格的恶搞视频在Instagram上流传。 该视频中&#xff0c;扎克伯格的面部表情极其僵硬&#xff0c;声音与本人的相比差距很大。 事实上&#xff0c;这是以色列一家科技公司利用人…

体验管理|如何快速低成本开始体验相关的数字化工作‼️

Guofu 第 95⭐️ 篇原创文章分享 &#xff08;点击&#x1f446;&#x1f3fb;上方卡片关注我&#xff0c;加⭐️星标⭐️~&#xff09; &#x1f68f; 写在前面 在体验经济时代&#xff0c;传统企业在应对新需求、新挑战的时候&#xff0c;也需要用新的方式进行企业升级和转型…

vant van-uploader组件实现点击图片进行编辑(更换图片)

示例图&#xff1a; 思路&#xff1a; 1.写两个uploader组件&#xff0c;确保他们样式一样&#xff0c;定位将他们重叠放在同一个位置。给其中一个uploader组件设置z-index&#xff0c;让她位于上方&#xff08;以下称为组件1&#xff09;&#xff0c;组件1用于触发选取图片的方…

怎么修改照片大小?一键快速修改图片宽高尺寸的方法

怎么修改照片大小&#xff1f;随着现在手机像素的提升&#xff0c;无论是用手机还是用相机拍摄出来的照片尺寸都越来越清楚&#xff0c;但是随之而来的问题就是图片也越来越大&#xff0c;因此导致大家在传输、使用的时候很不方便&#xff0c;那么有没有什么办法能解决这个问题…

如何编辑图片?图片如何编辑修改?

日常工作中很多情况是需要进行图片处理的&#xff0c;如果我们没合适图片编辑工具&#xff0c;处理图片可能就有些困难了&#xff0c;下载的处理图片软件操作难度过高&#xff0c;上手比较难。其实可以选择在线图片编辑&#xff08;https://www.yasuotu.com/tools&#xff09;网…

tui-image-editor编辑图片的使用

1.安装tui-image-editor 命令&#xff1a;npm i tui-image-editor 如果此步命令执行安装成功后启动还是报错找不到文件的话请检查以下文件 可手动添加到package.json后重新执行npm install 再次启动后便成功 或者单独安装此代码依赖块 npm install --save toast-ui/vue-ima…

数学好=编程能力强?答案或许跟你想的不一样

学好数理化&#xff0c;走遍全天下&#xff01;小时候&#xff0c;这句顺口溜时常在耳边响起&#xff0c;而迈入编程行业以后&#xff0c;又被不小人咨询&#xff0c;我数学不好&#xff0c;能写好代码吗&#xff1f; 不过最近的 MIT 神经科学家在 eLife 期刊发表了一项新研究…

为什么美国学生学的数学比我们简单,却能做出很牛逼的东西?

来源&#xff1a;IT有个 圈儿 &#xff02;美国给予不热爱数学的学生最基础的数学教育&#xff0c;而给予热爱数学的学生最高水平的数学教育。&#xff02; 长久以来&#xff0c;中国人的迷思就是&#xff0c;为何「美国人数学这么差&#xff0c;还能出这么多牛逼科学家&#x…

学计算机语言需要英语基础吗,数学和英语不好的人能学编程吗?

数学和英语不好的人能学编程吗&#xff1f; 有许多小伙伴问&#xff1a;学编程需要什么基础&#xff1f;很多人都会有一个下意识的想法就是英语数学不好就不能学编程&#xff0c;其实这是一个误区。从根本上来说学编程确实需要数学和英语。因为代码是用英文写的&#xff0c;数学…

“编程能力差,90%输在了数学上!”丨多数程序员都是瞎努力!

一流程序员学数学&#xff0c;二流程序员学算法&#xff0c;低端看高端就是黑魔法。 可能有人以为这就是个段子&#xff0c;但有过工作经验的都知道&#xff0c;这其实就是程序员的真实写照&#xff01; 想一想&#xff0c;我们学习、求职、工作的场景中&#xff0c;你一定因…

英语和数学不好是不是学不好编程?

做IT行业观察这个公众号已经三个多月~期间遇到很多想学编程&#xff0c;但又害怕学习编程的人&#xff0c;他们都有同样的问题&#xff1a; 学习编程&#xff0c;是否需要英语&#xff1f; 我数学不好&#xff0c;能学好编程吗&#xff1f; 学习编程&#xff0c;英文和数学肯定…

程序员不需要知道太多数学,你认同吗

之前在知乎看到一个问题&#xff1a; https://www.zhihu.com/question/48617074/answer/111889884 程序员不需要知道太多数学&#xff0c;你认同吗&#xff1f; 我听到的关于学习编程的最常见的顾虑&#xff0c;就是人们认为这需要很多数学知识。其实&#xff0c;大多数编程需…

为何敲代码,学好数学很重要?

数学是编程的灵魂所在。 作者 | Justin Meiners 译者 | 王艳妮&#xff0c;责编 | 屠敏 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 以下为译文&#xff1a; 程序员喜欢讨论编程语言。除了辩论它们各自的优点外&#xff0c;我们还喜欢将它们整合到我们的身份认…

【学术相关】为什么美国学生学的数学比我们简单,却能做出很牛逼的东西?...

本文转自|视觉算法 &#xff02;美国给予不热爱数学的学生最基础的数学教育&#xff0c;而给予热爱数学的学生最高水平的数学教育。&#xff02; 长久以来&#xff0c;中国人的迷思就是&#xff0c;为何「美国人数学这么差&#xff0c;还能出这么多牛逼科学家&#xff1f;」这个…

程序员的数学好难学?一切从基础开始!

数学知识对编程很有用&#xff0c;但是很多写给程序员的数学书都比较难。我们为什么不从基础的数学知识开始学习呢&#xff1f; 程序员的数学基础 Python实战 1.本书的重点不在于如何解题&#xff0c;而在于帮助读者在计算机世界里如何利用数学解决算法问题&#xff0c;让程序…

北大GPT解题有数学老师内味了,用人话讲难题,从高中数学到高数都能搞定

点击上方“视学算法”&#xff0c;选择加"星标"或“置顶” 重磅干货&#xff0c;第一时间送达 克雷西 发自 凹非寺量子位 | 公众号 QbitAI 北大团队教会AI把人话当编程语言用。 这下大语言模型&#xff08;LLM&#xff09;不光能做对数学题&#xff0c;而且解题过程你…

谁说数学好编程就好了?MIT告诉你:不对!

【编者按】不夸张地说&#xff0c;在这个时代&#xff0c;编程时时刻刻都在影响着整个世界的运转&#xff0c;它让我们的生活变得更加惬意悠闲。那编程到底是什么&#xff1f;应该算一门语言&#xff1f;还是算逻辑的具体实现&#xff1f; 作者 | Anne Trafton 译者 | 火火酱 …

ChatGPT能代替Oracle DBA吗?用Oracle OCP(1z0-083)的真题测试一下。

让我们来看看ChatGPT不能通过Oracle OCP的考试&#xff1f; 文章目录 引言测试过程总结和分析 关于博主&#xff0c;姚远&#xff1a; Oracle ACE&#xff08;Oracle和MySQL数据库方向&#xff09;。Oracle MAA 大师。华为云MVP。《MySQL 8.0运维与优化》的作者。拥有 Oracle …

跳出打工人的困局!程序员该怎么创业?

一位十二年的程序员老友和我说&#xff0c;他的公司倒闭了&#xff0c;现在准备清算&#xff0c;创业之初他带着梦想与对未来的期待踏出了这一步&#xff0c;没想到才短短两年就落得一场空。他对我表达出内心的不舍、惆怅&#xff0c;让我在聊天的过程也感同身受&#xff0c;个…