TP5权限管理笔记(RBAC)

说明一下:
登录模块不在权限管理之内,也就是说登录模块是单独的模块。打开登录页面不需要验证权限。当用户登录后台后跳转后台首页,这时候需要把用户的信息存到session或者cookie里面。进入后台之后你点击的每一个页面或者每一个操作都是访问某个方法。
说白了用户权限控制就是验证当前用户有没有当前访问的模块,控制器,以及方法的权利的验证,如果有打开页面,如果没权限提示没权限。
权限验证可以建立BaseController写构造函数验证,也可以使用路由中间件验证,原理都一样,不过是一个把验证方法写在base类一个把验证方法写在中间件里面而已。

权限管理之前自己写的比较简单,都是用123代替,然后页面的html判断角色是什么数字,然后决定显示还是隐藏元素,当然效果是有了,但是如果用户打开浏览器开发环境,把display:none去掉,所有功能都显示出来,这就尴尬了,所以,这次abrc模式改写了一下,既保留了元素的隐藏显示,又不用担心去掉display:none;

首先还是先建5张表,我们后面主要是从数据获取权限范围判断是否有访问权;
在这里插入图片描述
英语比较烂,所以表名起的都比较随意,勿吐槽!

我是用TP5写的,所以只讲tp5下的情况

表建好后,表的关联请看上图,完成添加权限,添加角色,添加管理员的功能,我们默认已经写好了
在这里插入图片描述
我的控制器有一个base.php用于其他控制器继承,在base里写一个权限判断的函数,(权限表一定要写清楚模块名,控制器名,方法名,我们就是用 这些名字判断的)
在这里插入图片描述
用常量保存当前模块,控制器,方法的名字,然后根据session里管理员的id和前面保存的模块,控制器,方法名做条件,到数据库查询,我是用count查询,如果返回1就是找到了,如果返回0就是false,就会输出没有访问权限,要判断一下超级管理员,我是用id为1判断的,直接拥有全部权限,但是后面关于菜单和功能按钮隐藏显示的时候需要判断下角色权限名,建议还给1添加一个超级管理员的角色,把所有的功能都打上,最后还判断了一下,让用户都可以进入首页,

这个函数放到base的初始化函数里执行,其他控制器都继承了base,所以进入每个页面都会执行
在这里插入图片描述
现在添加一个普通管理员,只有商品权限,没有品牌管理和分类管理权限,
在这里插入图片描述
把普通管理员分配给当前的账号,然后刷新后,品牌管理和分类管理还在,但是点击品牌的模块已经限制访问了
在这里插入图片描述
在这里插入图片描述
没有权限的,直接让它隐藏掉,接下来我们在base里两个函数,一个判断控制名,用来显示或隐藏菜单栏,一个判断方法名,隐藏,显示功能按钮
在这里插入图片描述
我用的方法比较笨,写了好多代码,我自己都觉得量大了,以后多写几次就好了,第一次就是这样,最重要实现功能

现在再在base里面写两个数组,一个控制器的,把所有控制名都写进去,一个方法的,把所有的方法名也写进去,
在这里插入图片描述
然后在各个控制器的进入首页的方法中把上面的方法和数组渲染到页面,menu和controller是判断菜单栏显示的,btn和action是判断页面的功能按钮的
在这里插入图片描述
用管理员页面菜单为例,箭头最上面标的是大菜单,截取controllers下面的3个小菜单返回的新数组(控制器名)与menus数组(开通的权限的控制器)做对比,然后获取返回数组的长度,如果大于0,就显示,等于0,就是小菜单的模块权限都没有开,就隐藏

箭头2,3,4就是直接拿controllers里面的对应的菜单的名字看下是不是在menus中,如果有就显示小菜单,没有就隐藏
在这里插入图片描述
大菜单就是一级菜单,小菜单就是展开后的二级菜单,也是各个控制器模块的入口
在这里插入图片描述
前面没有隐藏品牌菜单栏和分类栏现在已经隐藏了,就剩下开启权限的商品管理(产品管理),如果产品权限也关掉,一级菜单产品管理也会同时隐藏,只有二级菜单有显示它才会有
在这里插入图片描述
最后是页面的功能按钮,用每个功能按钮的名字判断是否在权限的方法名字数组里action[]action[对应的方法名]和btns做比较,方法和上面菜单栏是一样的

在这里插入图片描述
用户tom的分类管理没有开通添加,编辑和删除,只开启状态改变,所以只有一个按钮
在这里插入图片描述
管理员admin拥有所有权限,所以添加和编辑删除都在
在这里插入图片描述

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

微信扫一扫

微信扫一扫

微信扫一扫,分享到朋友圈

TP5权限管理笔记(RBAC)