tp5的RBAC插件及其使用很方便的管理用户登录及操作权限
tp5-rbac
本扩展包是tp5的rbac包,使用了部分tp5的特性实现了关系型数据库中特殊数据结构的处理。
安装方法
先安装composer如果不知道怎么安装使用composer请自行百度。
打开命令行工具切换到你的tp5项目根目录
如果没有安装migaration与nestedset,先安装
composer require topthink/think-migration:*
composer require gmars/tp5-nestedsets:dev-master
composer require gmars/tp5-rbac
- 1
如果该方法报错请按照以下方式操作:
- 打开项目根目录下的composer.json
- 在require中添加”gmars/tp5-rbac”: “dev-master”
- 运行composer update
添加后composer.json应该有这样的部分:
"require": {
"php": ">=5.4.0",
"topthink/framework": "^5.0",
"gmars/tp5-rbac": "dev-master"
},
- 1
- 2
- 3
- 4
- 5
数据迁移
在使用本插件之前需要有rbac锁需要的数据库。在迁移之前如果你的数据库中已有user数据表那么请你备份自己的user数据表后删除。
在你的项目的某个config.php中加入如下配置:
'migration' => [
'path' => ROOT_PATH .'vendor/gmars/tp5-rbac/'
],
- 1
- 2
- 3
然后把命令行切换到你的项目根目录Windows是cmd运行如下命令
php think migrate:run
- 1
如果迁移运行成功会在你的数据库中生成如下几张表:
user 用户表
user_role 用户角色对应表
role 角色表
role_permission 角色权限对应表
permission 角色表
- 1
- 2
- 3
- 4
- 5
使用该插件–RBAC的管理
在一个系统中RBAC是基于角色的权限控制。作为开发人员需要明白这是两个不同的过程。第一个就是构建系统的RBAC结构,包括添加权限,角色,用户,用户角色对应关系,角色权限对应关系等。
在此先说明RBAC管理:
1.添加用户
这一步是在用户注册时要做的一步,就是讲注册的用户添加到user表中。
$rbacObj = new Rbac();
$data = ['user_name' => 'zhangsan', 'status' => 1, 'password' => md5('zhangsan')];
$rbacObj->createUser($data);
- 1
- 2
- 3
创建用户时传入唯一一个参数必须是数组。数组中应该包含用户表需要的数据。如果出现其他非user表的字段则会抛出异常。
该方法返回的结果为false或者Exception或者新添加用户的id。
2.添加权限
这一步是构建系统的权限。一般我们是以请求的路由为权限的识别标志。在该插件中使用path字段。
例如我们的系统中有商品列表这样的一个操作需要授权。
其路由为 /index/goods/list
添加路由如下:
$rbacObj = new Rbac();
$data = [
'name' => '商品列表',
'status' => 1,
'description' => '查看商品的所有列表',
'path' => '/index/goods/list',
'create_time' => time()
];
$rbacObj->createPermission($data);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
3.添加角色
在RBAC的角色中角色是有父子关系的,也就是说所添加的角色可以是另一个角色的子角色。
$rbacObj = new Rbac();
$data = [
'name' => '商品管理员',
'status' => 1,
'description' => '商品管理员负责商品的查看修改删除等操作',
'sort_num' => 10,
'parent_id' => 1
];
$rbacObj->createRole($data);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
需要注意的是在data中有个字段为parent_id这个字段标识了所要添加的角色的父角色。如果留为空则便是添加的父角色。
4.为用户分配角色
当然一个用户可以有多个角色。一般是使用多选框或其他形式选择后以数组的方式传入的。
例如:
$rbacObj = new Rbac();
$rbacObj->assignUserRole(1, [1, 2]);
- 1
- 2
assignUserRole(userId,arrayroleArray = [])
该方法的第一个参数为用户id第二个参数是一个一位数组,其元素为角色的id
5.为角色分配权限
例如:
$rbacObj = new Rbac();
$rbacObj->assignRolePermission(1, [1, 2]);
- 1
- 2
将id分别为1,2的权限分配给id为1的角色
6.删除角色
删除角色的同时必须删除角色和权限的对应数据
$rbacObj = new Rbac();
$rbacObj->delRole(1);
- 1
- 2
其中需要传入的是角色id
7.将一个角色移到另一个角色下
以上已经说明了角色是有父子关系的那么肯定能够移动其位置
$rbacObj = new Rbac();
$rbacObj->moveRole(1,3);
- 1
- 2
该例子是将id为1的角色移动到id为3的角色下作为子角色。
还有其他修改删除等方法的文档日后再补全,功能是有的
使用该插件–RBAC权限验证
登录后获取权限列表
如果自己写权限验证则请忽略这一步,如果要使用rbac插件来验证权限则必须要这样做。
在登录成功后做如下操作:
$rbacObj = new Rbac();
$rbacObj->cachePermission(1);
- 1
- 2
这个方法是查询id为1的用户的所有权限并且以path索引后存入cache
请求时的权限验证
当然对于每一个方法都要进行权限验证时我们一般是在某一个父类中定义一个方法进行权限验证,验证如下:
$rbacObj = new Rbac();
$rbacObj->can('/index/goods/list');
- 1
- 2
该方法是验证当前用户有没有操作/index/goods/list的权限,如果有则返回true如果无则返回false
其中can的参数可以使用tp5的特性获取。
tp5的RBAC插件及其使用很方便的管理用户登录及操作权限的更多相关文章
- jQuery 浮动标签插件,帮助你提升表单用户体验
浮动标签模式(Float Label Pattern)是最新流行的一种表单输入域的内容提示方式,当用户在输入框输入内容的时候,原先占位符的内容向上移动,显示在输入的内容的上面.这里推荐的这款 jQue ...
- 基于Metronic的Bootstrap开发框架经验总结(17)-- 使用 summernote插件实现HTML文档的编辑和图片插入操作
在很多场合,我们需要在线编辑HTML内容,然后在页面上或者其他终端上(如小程序.APP应用等)显示,编辑HTML内容的插件有很多,本篇介绍基于Bootstrap的 summernote插件实现HTML ...
- 很漂亮的用户登录界面HTML模板
效果预览:http://keleyi.com/keleyi/phtml/divcss/21.htm HoverTree开源项目实现了分层后,准备实现管理员后台登录,这里先把登录界面的HTML模板整理好 ...
- php版redis插件,SSDB数据库,增强型的Redis管理api实例
php版redis插件,SSDB数据库,增强型的Redis管理api实例 SSDB是一套基于LevelDB存储引擎的非关系型数据库(NOSQL),可用于取代Redis,更适合海量数据的存储.另外,ro ...
- Kubernetes RBAC授权普通用户对命名空间访问权限
Kubernetes RBAC授权普通用户对命名空间访问权限 官方文档:https://www.cnblogs.com/xiangsikai/p/11413970.html kind: Role ap ...
- 常用vim插件的安装、使用和管理
1.Ctags Ctags工具是用来遍历源代码文件生成tags文件,这些tags文件能被编辑器或者其他工具用来快速查找定位源代码中的符号,入变量名,函数名等.比如,tags文件就是Taglist和 ...
- 用jQuery插件来提升SharePoint列表表单用户体验
本文将描述如何通过简单的CSS和jQuery插件提升SharePoint默认的列表表单体验.这些小技巧并不仅仅改善了外观,还提升了可用性. 剩余字数 我们以通知列表为例.通知正文字段假设要求不应该超过 ...
- 开发vue插件并发布到npm包管理工具的流程
1-10是开发流程,后面的是发布流程 1. 在Git里面…新建项目 2. 克隆项目到本地用来开发 git clone https://github.com/***/vue-prevent-brow ...
- 关于360插件化Replugin Activity动态修改父类的字节码操作
近期在接入360插件化方案Replugin时,发现出现崩溃情况. 大概崩溃内容如下: aused by: java.lang.ClassNotFoundException: Didn't find c ...
随机推荐
- js中定时器
周期性定时器:周期性的执行某段代码 window.setInterval() window.clearInterval() 示例: document.it = setInterval(fun ...
- dubbo支持的注册中心
dubbo支持的注册中心 Dubbo提供的注册中心有如下几种类型可供选择: Multicast注册中心 Zookeeper注册中心 Redis注册中心 Simple注册中心 ZooKeeper是一个开 ...
- Grunt新手入门篇
今天看到一篇通俗易懂的Grunt入门文章,博主写得很用心,原文请戳:http://yujiangshui.com/grunt-basic-tutorial/ 当时学习 Grunt 的时候,真是很头疼. ...
- arpg网页游戏特效播放(一)
网页游戏中的特效,主要包括:场景特效,攻击特效和UI特效三种.场景特效是在地图层上播放的特效,攻击特效主要是技能触发的一些特效,UI特效是面板上的一些特效,还有一些在人物身上播放的特效,例如脚底光圈特 ...
- struts2读取request,session,application中的值
request.----> <s:property value="#request.mySessionPropKey"/> or <s:property v ...
- stm32 DMA配置
DMA就是将一个地址空间复制到另外一个地址空间.DMA传输方式无需CPU直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为RAM与I/O设备直接传送数据,使CPU的效率大大的提高 ...
- HDU 2647:Reward(拓扑排序+队列)
Reward Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- 51Nod 1066:Bash游戏 (巴什博弈)
1066 Bash游戏 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 有一堆石子共有N个.A B两个人轮流拿,A先拿.每次最少拿1颗,最多拿K颗,拿到 ...
- 定时器setTimeout()的传参方法
更具体的代码:http://www.cnblogs.com/3body/p/5416830.html // 由于setTimeout()的延迟执行特性,所以在执行的函数中直接使用外部函数的变量是无法获 ...
- dell support
部門營業時間 電話號碼訂單支援中小型企業 (員工不多於 500名 )00852-3416-0910 9:00 - 18:00 訂單編號: 810607806 訂單日期: 26/11/2014 客戶 ...