权限管理基本是作为网站的标配了;
除非是像博客这类个人使用的;否则权限管理的重要性不言而喻;
今个就来写写auth权限管理;
thinkphp已经内置了auth权限类位于:/ThinkPHP/Library/Think/Auth.class.php
执行里面的sql生成3张表auth_rule、auth_group、auth_group_access;
然后自己再建一张users表;当然起其他的名字也是可以的;不过是需要在配置项中说明;
先对各表的作用简单介绍;
users:用户表;这个不废话;
auth_group:用户组表;比如说超级管理员组、普通管理员组、编辑等等;同时记录每个管理组有哪些权限;
auth_group_access:用户、群组关联表;比如说用户1属于超级管理员、用户2属于普通管理员和编辑;
auth_rule:权限表;具体的每条权限是什么;
如果还没看过权限管理;那建议先看源代码;透彻学习一样东西;最好的方法就是研究源代码;
这里重点不是要讲auth的原理;而是要给一个auth的demo;
git源代码:https://github.com/baijunyao/thinkphp-bjyadmin
1:先下载项目并安装;
完成后分别点超级管理员登录和文章管理员登录;
你会发现他们的权限是不同的;看到的后台菜单是不一样的;
2:菜单管理
为了控制每种管理员都能看到那些菜单;所以要有菜单的管理;
操作的是demo中的admin_nav表
3:权限管理
具体的每项权限的名称和内容;我这里一般都是和菜单对应的;
但是会比菜单管理多出一些;对比两张图即可看出来;多出来的一般都是些对菜单的增删改;
操作的是demo中的auth_rule表;
4:用户组管理
这里就是增加管理组;并为每个管理组分配权限了;选中的就表示有权限看到或者操作了;
5:管理员列表
把所有的管理员都列出来;可以添加管理员或者修改管理员的管理组;
当构建好这样一个结构后;权限管理简单其实只需要AdminBaseController.class.php中如下一段代码就完成了;
/Application/Common/Controller/AdminBaseController.class.php
$auth=new \Think\Auth();
$rule_name=MODULE_NAME.'/'.CONTROLLER_NAME.'/'.ACTION_NAME;
$result=$auth->check($rule_name,$_SESSION['user']['id']);
if(!$result){
$this->error('您没有权限访问');
}
这也是在 thinkphp的目录结构设计经验总结 中讲述 /Application/Common/Controller中建各种BaseController的原因;
本文为白俊遥原创文章,转载无需和我联系,但请注明来自白俊遥博客https://baijunyao.com 欢迎捐赠赞赏加入组织创建QQ群及捐赠渠道
何 遇 :大哥 你的节点控制,auth_role 里面没有对应的控制器,页面上为什么有数据?
2019-05-08 20:35:18 回复
小六HI :Laravel 权限认证啥时候出个教程呢?zizaco/entrust 这个包好久不更新了。
2019-03-06 11:31:23 回复
い_____阿狸丶 :大神,什么时候出一套关于TP5的
2018-11-06 10:14:22 回复
式微 :遥哥我要给你生猴子
2018-05-07 10:30:12 回复
加藤非 :俊哥,能不能整理一个第三方登录demo,像本站qq登录
2017-11-06 14:06:04 回复
云淡风晴 :我网站的代码开源了;可以clone下来直接用;或者对照着整合入自己的系统;
2017-11-07 23:55:13 回复
田田田i :数据库配置在哪?我在本地测试完后往主机上放就报没有配置数据库
2017-10-18 18:54:02 回复
云淡风晴 :Public/install/bjyadmin.sql 实在不行可以参考这篇文章的暴力安装部分;https://baijunyao.com/article/104
2017-11-07 23:58:17 回复
人情味。 :哥 你的权限控制里面的用户组管理 里面的删除 有bug
2017-09-30 11:37:33 回复
云淡风晴 :多谢反馈;已修复;
2017-09-30 23:12:33 回复
:哥,我发现用户组管理的删除出错了,在删除用户组的Rulecontroller.class.php,中的delete_group方法中的$map的键是id为什么到删除的BaseModel.class.php中的deleteData中$map的键就变成了group_id了呢?????谢谢哥帮看一下
2017-09-30 00:02:38 回复
云淡风晴 :是说AuthGroupModel 立马的group_id吧?那是删除关联表的;不过提示有问题;我修复了;多谢反馈;
2017-09-30 23:12:23 回复
:谢谢哥
2017-10-03 14:32:16 回复
三块钱 :怎么没有删除用户的功能?
2017-09-26 16:34:30 回复
青春不辉煌 :自己加一个呗
2017-12-05 17:13:29 回复
追风筝的人 :就是这种一个管理员对应多个角色 ,感觉一个管理员对应一个角色才最好吧
2017-08-22 16:04:19 回复
黄粱 :问个问题,类似于/article/12 这种类型的路由在RBAC当中该怎么设权限规则才能动态匹配呢
2017-08-16 15:29:22 回复
Lii :感觉学auth最好的方式就是直接看TP自带的auth源码,冒着被骂的风险上班研究写完了。 基本的思路其实不难,剩下的就是考虑简化授权流程比如权限分组快速选择
2017-08-06 23:40:33 回复
无题 :大神你好,为何我第一次check就提示没有权限呢,任何一个网页都访问不了
2017-07-27 15:24:31 回复
云淡风晴 :那就是真没权限;环境没搭建好;
2017-08-04 00:04:20 回复
@汇魂草 :大神就是大神,,请问怎样对一个功能进行权限控制呀,,比如说我做了一个下拉列表框,,我只有给别人看一半的数据,,而剩下的一半他没有权限访问??求大声指点??
2017-07-27 12:00:13 回复
Gaol :我能想到的解决思路是后台查看当前用户的role, 并设置一个返回的flag(标记), 前台通过flag 过滤数据展示
2018-10-03 09:21:17 回复
循礼门PHPer :请问下,这个权限列表遍历出来了,加了很多条权限,怎么调用分页类呢?
2017-07-24 11:23:52 回复
云淡风晴 :如果需要加分页的话;只查pid=0的分页即可;然后关联查子权限;
2017-07-24 22:54:29 回复
南山人 :Common/Model 里AuthRuleModel.class找不到这个文件怎么办?
2017-07-12 15:52:11 回复
云淡风晴 :这个文件在啊?
2017-07-12 23:15:58 回复
南山人 :俊哥能留个qq或者微信么,我加你后再好好聊一聊这个问题,一两句说不清。
2017-07-13 07:55:25 回复
南山人 :我的qq是347489577
2017-07-13 14:31:19 回复
Aimee :数据库 在哪里啊 · 大神··
2017-06-23 16:10:06 回复
云淡风晴 :安装自动导入数据库;参考项目的readme;
2017-06-28 22:18:16 回复
Joy :大撒旦
2018-05-21 22:48:50 回复
大海 :白哥,数据库表admin_nav 字段里面的控制器立即showNav是那个,我在你的控制器里面没找到,$nav_data=D('AdminNav')->getTreeData('level','order_number,id'); 我在执行这句代码的时候获取不到数据,数组是空 ,Common\Controller\AdminBaseController;Common\Controller\Basemodel已经继承到了,求教
2017-05-11 18:24:42 回复
Aimee :知道数据库在哪里吗
2017-06-23 16:10:35 回复
ˇ珍惜现在 :关于菜单排序的问题,添加新的二级菜单,为什么有的时候是├─和└─会乱?这个该怎么修改呢?请指教
2017-05-04 18:02:40 回复
Aimee :知道数据库在哪里吗
2017-06-23 16:11:03 回复
Tank_O_oO/ :安装文件在public 下,自己看看吧~
2017-06-23 16:15:45 回复
Aimee :怎么安装 就是数据库导入吗
2017-06-23 17:00:13 回复
追风筝的人 :我也有这种问题
2017-08-22 15:59:21 回复
Tank_O_oO/ :这个我已经处理好了~
2017-08-22 16:01:10 回复
小蜗牛 :俊哥,我想问下权限的配置管理在哪儿,我想把你的权限搬在我的项目上来,需要哪些操作,USER表名字不一样
2017-03-30 11:03:25 回复
Carpe Diem :俊哥,您好,我有个问题咨询下,菜单管理加上分页有的子菜单就显示不了,请教下您,还望您看到回复下。
2017-03-23 15:23:03 回复
小蜗牛 :兄弟,你的权限会了吗,能请教些问题不
2017-03-29 14:56:53 回复
Carpe Diem :俊哥,您好,我有个问题咨询下,菜单管理加上分页有的子菜单就显示不了,请教下您,还望您看到回复下。
2017-03-23 09:40:22 回复
循礼门PHPer :请问你的分页问题解决了吗?这个列表中是怎么调用分页类的?
2017-07-24 11:25:19 回复
云淡风晴 :如果需要加分页的话;只查pid=0的分页即可;然后关联查子权限;
2017-07-24 22:54:11 回复
可以 :发起人发过吧
2017-03-06 16:53:38 回复
狗蛋的爹 :你好,能给我一份sql吗?
2017-03-02 10:22:54 回复
大师兄 :俊哥,给第3层权限添加子权限,比如添加文章再加个子权限,在权限分配页面没有展示出来。这里应该怎么搞。
2017-02-28 15:51:58 回复
变形金刚 :找到了。
2017-01-22 15:46:38 回复
变形金刚 :俊哥,sql文件在哪里,我没找到
2017-01-22 15:43:41 回复
操笔写庸人 :在adminController中index方法中获取列表是多维数组,navController中获取数组获取来的是一维数组,代码一模一样,这是为什么,而且在修改完nav惨菜单管理,那一条记录却不能被tree解读了
2017-01-13 14:07:30 回复
操笔写庸人 :不好意思看错了,2个方法传入的变量不一样
2017-01-13 14:11:56 回复
吴伟祥 :还有一条建议就是你的博客留言最好加一个代码输入标签
2017-01-09 17:39:40 回复
云淡风晴 :博客准备重构中;
2017-01-09 23:17:25 回复
吴伟祥 :我也是看别的权限里面有这个 感觉挺好的
2017-01-09 16:51:30 回复
吴伟祥 :if ($id==1) { $this->error('该分组不能被删除'); }这一句要加上,还有用户那个方法也是。刚刚误删,就要重装了!尴尬!/** * 删除用户组 */ public function delete_group(){ $id=I('get.id'); if ($id==1) { $this->error('该分组不能被删除'); } $map=array( 'id'=>$id ); $result=D('AuthGroup')->deleteData($map); if ($result) { $this->success('删除成功',U('Admin/Rule/group')); }else{ $this->error('删除失败'); } }
2017-01-09 16:50:11 回复
云淡风晴 :多谢分享;
2017-01-09 23:17:38 回复
吴伟祥 :没有急着下载你的源码,而是分析你的思路,对照着auth类,看了不下十五遍!才看通了!我太笨了!
2017-01-06 16:30:30 回复
云淡风晴 :真是个好学的好孩纸;
2017-01-07 11:04:51 回复
吴伟祥 :你的这个帖子真有用!谢谢你!
2017-01-06 16:24:16 回复
云淡风晴 :不客气;
2017-01-07 11:04:59 回复
思念如酒 :$auth = new \Think\Auth(); if (!$auth->check('MODULE_NAME.'/'.CONTROLLER_NAME.'/'.ACTION_NAME',$_SESSION['user']['id'])) { $this->error('没有权限!',U('/User/index')); }为什么我这么写就提示权限认证通不过呢??一直想不通,求帮忙解答
2016-12-26 10:48:36 回复
云淡风晴 :检查此用户是否有权限;
2017-01-02 14:14:09 回复
mg呼呼 :哥们你博客是蹦了么?一吨重的报错
2016-12-26 09:57:50 回复
云淡风晴 :一吨重蹦不起来啊;
2017-01-02 14:12:56 回复
Serene :我写了一个函数调用orderData(),参数也照常是order_number,点击排序后返回排序成功,但是界面并不是排序后的结果。表单action正确,查了好久,不知道是什么错误,你知道是哪里出错了么?
2016-12-08 14:55:10 回复
云淡风晴 :数据库表也要有order_number字段;检查排序后;数据库的数据是否对应的也改成功了;
2016-12-11 22:00:26 回复
Serene :对应数据表有order_number字段;点击排序后,数据也能写入数据库,返回也是‘排序成功’;但界面就是没有进行排序。
2016-12-12 10:38:01 回复
云淡风晴 :在orderData中打印;对比可以改变顺序的数据;找下原因;
2016-12-22 23:10:57 回复
Serene :你好,\Org\Nx\Data::channelLevel() 调用该方法,得到的数据里面字段mca代表什么呢?不是很明白Data类,我要在你的demo做二次开发,这个类必须弄完全明白么?该怎么读更容易弄懂这个类呢?
2016-12-06 18:34:15 回复
Serene :mca知道了。 getTreeData得到的是一个三维数组?我新建菜单,但在左侧菜单并没有显示出来,是什么情况呢?还有关于菜单排序的问题,添加新的二级菜单,为什么有的时候是├─和└─会乱?
2016-12-07 10:24:49 回复
Serene :左侧菜单没显示出来的原因是我粗心把菜单的mca写错了。
2016-12-07 10:47:44 回复
云水谣 :我看程序中好几处出现 $v['_data'] 这个没看懂出处啊 麻烦有空给回复下
2016-12-05 16:56:10 回复
云淡风晴 :是这个生成树形结构的类定义的/ThinkPHP/Library/Org/Bjy/Data.class.php
2016-12-05 22:31:19 回复
Serene :最近在学权限管理,学着学着把RBAC和tp自身的auth类给混淆了,希望博主有空分享下关于tp的auth类和RBAC具体区别在哪里,优缺点等等~先谢谢博主~\(≧▽≦)/~啦啦啦
2016-11-03 12:28:45 回复
云淡风晴 :在写出来之前;可以先参考这篇文章:http://www.thinkphp.cn/topic/4029.html
2016-11-03 23:59:34 回复
香蕉你个banana :白大神,admin_nav这个数据表里面有一个字段oreder_number代表什么意思,我一直搞不清楚代表什么意思
2016-09-21 15:45:15 回复
云淡风晴 :排序用的;决定了页面中显示的顺序;
2016-09-21 22:08:52 回复
香蕉你个banana :谢谢
2016-09-22 09:25:29 回复
怯凡 :看来写死了只能是二级菜单吧
2016-09-16 10:10:10 回复
云淡风晴 :恩恩;前端页面是写成二级页面的;如果需要多级;可以根据自己的业务来改;
2016-09-16 14:55:55 回复
老魏 :git下载下来代码,没有CSS和JS的样式呀? 俊哥,没有Public/aceadmin/这个文件夹,麻烦给看看呗
2016-09-12 11:30:48 回复
云淡风晴 :是放在根目录下么?
2016-09-12 21:54:25 回复
O(∩_∩)O :这个权限可以不给组设 给单个用户设置权限吗这个auth权限和普通的5张表的RBAC权限 有哪些区别
2016-09-09 15:10:07 回复
独自呵呵~ :你是想给单个操作节点设置权限吗 我写了一个对单节点设置权限的
2016-09-09 16:11:07 回复
云淡风晴 :概念是这样说的:http://www.thinkphp.cn/topic/4029.html
2016-09-10 00:10:39 回复
Hello world. :谢谢啦,学到很多东西。
2016-09-05 16:15:28 回复
Hello world. :666
2016-09-05 16:15:04 回复
Hello world. :666
2016-09-05 16:15:02 回复
浅∮时♂光£ :我用了你的后台 随着操作的不断增加 进入后台首页的时间越来越慢 有30多秒啊~
2016-09-02 11:27:51 回复
云淡风晴 :感谢反馈;是360的cdn抽风了;已经替换为本地的jquery;拉取最新版的就可以了;或者根据新提交的git来修改你的项目;
2016-09-02 12:07:37 回复
浅∮时♂光£ :哦 知道了 还有一个问题 我加了一个后台单入口, 直接进入的话会跳过登录界面,我另建这个单入口的目的是因为前台做分页的时候会报错 找不到模块
2016-09-02 12:23:02 回复
云淡风晴 :继承了/Application/Common/Controller/AdminBaseController.class.php 的控制器才会有权限检测;
2016-09-03 10:39:03 回复
Y :俊哥, 想问下,BaseModel.class和AuthRuleModel.class这两个文件中都有了deleteData这个方法, 这样写有什么想法?不过也是加了个判断而已. 但如果调用D('AuthRule')的话, 则是优先调用了AuthRuleModel.class中的方法
2016-08-31 17:21:54 回复
云淡风晴 :这只是个示例;在别的业务中;可能就不止是一个判断了;可能有更多的逻辑;AuthRuleModel.class中的deleteData是会覆盖掉中的BaseModel.class的deleteData;
2016-08-31 23:15:48 回复
简简单单 :俊哥,我小白,你能说一下怎么安装到自己项目中吗?看了你这个,看见有点蒙蔽~谢谢
2016-08-31 16:29:19 回复
云淡风晴 :想整合到自己的项目中?那就要把后台的模块;数据库文件;还有html都拷过去了;
2016-08-31 23:13:54 回复
╰_______________Semoon™ :你好。请问一下这个权限设置他是设置用户组的权限。要是想对单个用户设置一些额外的权限要怎么做呢?
2016-08-29 17:43:14 回复
云淡风晴 :你好;可以设置一个额外的组包含额外的权限;用户可以属于多个用户组;
2016-08-29 22:14:49 回复
90启航科技 :白大大这个新建模块模板添加成功后跳转新窗口,这个怎么改成跳转当前窗口啊
2016-08-22 12:25:11 回复
云淡风晴 :不好意思;没太明白什么问题?
2016-08-22 21:05:53 回复
白。 :还有几个方法里传入了_level这个参数 这个参数是怎么来的
2016-08-18 15:49:24 回复
云淡风晴 :具体可以查看这个类:/ThinkPHP/Library/Org/Nx/Data.class.php
2016-08-22 21:04:35 回复
白。 :首先感谢博主分享,这里想问一下后台根据权限获得菜单的手传入的参数是怎么来的getTreeData('level','order_number,id');
2016-08-18 13:26:36 回复
云淡风晴 :这个是无限级分类用的:/ThinkPHP/Library/Org/Nx/Data.class.php
2016-08-22 21:04:20 回复
I am Null! :菜单中也需要权限中的操作怎么办?最后还是内容一样了吗?
2016-08-11 17:59:18 回复
I am Null! :您好 为什么不直接对菜单进行权限操作呢?需要再建一个权限表,望解答我的疑惑,谢谢
2016-08-11 17:32:22 回复
云淡风晴 :因为它们并不是完全一一对应的;权限肯定会比菜单多;比如说后台那个左侧导航菜单;只需要有一个文章列表菜单并不需要编辑文章、删除文章的菜单;编辑、删除文章这可以作为一个按钮;所以;如果直接对菜单进行权限操作文章列表是可以的;但是编辑、删除文章的按钮还是要有一张权限表来做限制;
2016-08-11 17:46:30 回复
I am Null! :菜单中也需要权限中的操作怎么办?最后还是内容一样了吗?
2016-08-11 17:59:03 回复
云淡风晴 :这种设计的效果是;后台的每个菜单肯定都会对应一个权限;它们的内容是一样的;但是权限会比菜单多一些;多的就是那些需要权限控制的按钮;
2016-08-11 18:05:10 回复
I am Null! :SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost' (using password: NO)错误位置FILE: D:\phpStudy\WWW\shuaibai123-thinkphp-bjyadmin-master\thinkphp-bjyadmin\ThinkPHP\Library\Think\Db\Driver.class.php LINE: 115这怎么排除?
2016-08-11 15:17:01 回复
I am Null! :解决了是密码问题
2016-08-11 15:29:08 回复
轨迹HLGC :请问博主是怎么控制对应用户只能获取有自己权限的菜单,因为看您的demo,文章管理员是不会显示非自己权限的菜单的,这一点是在哪里实现的呢,也是auth的check()方法么
2016-08-08 23:43:47 回复
云淡风晴 :http://git.oschina.net/shuaibai123/thinkphp-bjyadmin/blob/master/Application/Common/Controller/AdminBaseController.class.php 是用的check方法配合数据库中记录的权限;
2016-08-09 14:13:24 回复
小号 :请先登陆后发表评论
2016-08-03 10:43:25 回复
轨迹HLGC :新增一个新的三级的id就可以了,这个是否为正确的逻辑
2016-08-02 09:51:53 回复
云淡风晴 :pid的对应必须正确才可以正常遍历;
2016-08-03 16:38:54 回复
轨迹HLGC :您好呀,请问data.class,是否限制了遍历级别,在遍历树形结构时,第三层会无法添加数据,请问如何修改这个层级
2016-08-02 09:40:03 回复
云淡风晴 :没有限制的;
2016-08-03 16:38:29 回复
后端-晨阳 :你好 这个文章管理员 与超级管理员 没有啊
2016-07-29 13:25:24 回复
云淡风晴 :程序是否正常安装成功了?
2016-07-31 03:01:04 回复
Hearing aids boy's²º¹⁶ :提示数据库连接失败,我式了本地和阿里云的都提示一样
2016-07-28 11:18:42 回复
云淡风晴 :是走的安装流程么?环境是否开启了mysqli?
2016-07-28 12:56:24 回复
堂满玉金 : ???
2016-07-18 13:54:17 回复
云淡风晴 :哈哈;这是故意写的;
2016-07-18 20:33:41 回复
Passer :这种权限设计就是太工程思维了
2016-06-21 23:55:35 回复
缘分 :http://www.9vm.cn/ 你看看嘛
2016-05-23 16:54:03 回复
缘分 :安装登录后怎么找不到文件啊
2016-05-23 16:27:46 回复
云淡风晴 :怎么提示的呢?
2016-05-23 16:46:15 回复
缘分 :登录成功跳转后就找不到文件啊
2016-05-23 16:48:12 回复
第一缕阳光 :博客不错哦
2016-05-19 17:47:58 回复
云淡风晴 :跟你的比;差远了;
2016-05-19 21:39:01 回复
最新评论