thinkPHP5使用Rabc实现权限管理


Posted in PHP onAugust 28, 2019

在之前我们已经了解了think3.2Rbac的权限管理操作,但是在thinkPHP5中thinkPHP没有内置Rabc操作,所以我们需要使用一个thinkPHP的Rbac拓展来实现权限管理,在thinkPHP中我们可以使用gmars/tp5-rbac拓展来实现权限管理

gmars/tp5-rbac地址: https://packagist.org/package...

一:gmars/tp5-rbac安装

composer require gmars/tp5-rbac

二:gmars/tp5-rbac使用

1:Rbac数据库创建

gmars/tp5-rbac中我们需要使用到六张表,分别为:权限节点表(permission),permission_category(权限分组表),role(角色表),role_permission(角色权限关联表),user(用户表),user_role(用户角色关联表)

当我们使用composer将gmars/tp5-rbac下载下来之后,我们可以发现在vendorgmarstp5-rbac目录下有一个gmars_rbac.sql文件,此文件内就为我们所需要创建表的sql

下面sql中###为你的表前缀,下面只是展示我们呢所需要的表sql,创建表gmars/tp5-rbac提供了方法来帮我们自动创建我们所需要的表

//实例化rbac
$rbac = new Rbac();
//初始化rbac所需的表,可传入参数$db为数据库配置项默认为空则为默认数据库(考虑到多库的情形)
$rbac->createTable();

上面的方法会生成rbac所需要的表,一般只执行一次,为了安全,执行后会加锁,下次要执行需要删除锁文件再执行

(1):权限节点表(permission)

DROP TABLE IF EXISTS `###permission`;
CREATE TABLE `###permission` (
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `name` varchar(50) NOT NULL DEFAULT '' COMMENT '权限节点名称',
 `type` smallint(4) unsigned NOT NULL DEFAULT '0' COMMENT '权限类型1api权限2前路由权限',
 `category_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '权限分组id',
 `path` varchar(100) NOT NULL DEFAULT '' COMMENT '权限路径',
 `path_id` varchar(100) NOT NULL DEFAULT '' COMMENT '路径唯一编码',
 `description` varchar(200) NOT NULL DEFAULT '' COMMENT '描述信息',
 `status` smallint(4) unsigned NOT NULL DEFAULT '0' COMMENT '状态0未启用1正常',
 `create_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',
 PRIMARY KEY (`id`),
 KEY `idx_permission` (`path_id`,`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='权限节点表';

(2):permission_category(权限分组表

SET FOREIGN_KEY_CHECKS=0;
DROP TABLE IF EXISTS `###permission_category`;
CREATE TABLE `###permission_category` (
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `name` varchar(50) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '权限分组名称',
 `description` varchar(200) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '权限分组描述',
 `status` smallint(4) unsigned NOT NULL DEFAULT '1' COMMENT '权限分组状态1有效2无效',
 `create_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '权限分组创建时间',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT '权限分组表';

(3):role(角色表)

DROP TABLE IF EXISTS `###role`;
CREATE TABLE `###role` (
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `name` varchar(50) NOT NULL DEFAULT '' COMMENT '角色名',
 `description` varchar(200) NOT NULL DEFAULT '' COMMENT '角色描述',
 `status` smallint(4) unsigned NOT NULL DEFAULT '0' COMMENT '状态1正常0未启用',
 `sort_num` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '排序值',
 PRIMARY KEY (`id`),
 KEY `idx_role` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色表';

(4):role_permission(角色权限关联表)

DROP TABLE IF EXISTS `###role_permission`;
CREATE TABLE `###role_permission` (
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `role_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '角色编号',
 `permission_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '权限编号',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色权限对应表';

(5):user(用户表)

DROP TABLE IF EXISTS `###user`;
CREATE TABLE `###user` (
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `user_name` varchar(50) NOT NULL DEFAULT '' COMMENT '用户名',
 `password` varchar(64) NOT NULL DEFAULT '' COMMENT '用户密码',
 `mobile` varchar(20) NOT NULL DEFAULT '' COMMENT '手机号码',
 `last_login_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最后一次登录时间',
 `status` smallint(4) unsigned NOT NULL DEFAULT '0' COMMENT '状态0禁用1正常',
 `create_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '账号创建时间',
 `update_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '信息更新时间',
 PRIMARY KEY (`id`),
 KEY `idx_user` (`user_name`,`mobile`,`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';

(6):user_role(用户角色关联表)

DROP TABLE IF EXISTS `###user_role`;
CREATE TABLE `###user_role` (
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `user_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '用户id',
 `role_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '角色id',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户角色对应关系';

2:rbac的相关操作

(1)创建权限分组

//实例化rbac
$rbac = new Rbac();
//创建权限分组
$rbac->savePermissionCategory([
  'name' => '用户管理组',
  'description' => '网站用户的管理',
  'status' => 1
]);

当savePermissionCategory方法中包含了主键id时为编辑权限分组

(2)创建权限节点

//实例化rbac
$rbac = new Rbac();
//创建权限节点
$rbac->createPermission([
  'name' => '文章列表查询',
  'description' => '文章列表查询',
  'status' => 1,
  'type' => 1,//type为权限类型1为后端权限2为前端权限
  'category_id' => 1,//权限分组的id
  'path' => 'article/content/list',
]);

当createPermission方法中包含了主键id时为编辑权限节点

(3)创建角色&给角色分配权限

//实例化rbac
$rbac = new Rbac();
//创建角色&给角色分配权限
$rbac->createRole([
  'name' => '内容管理员',
  'description' => '负责网站内容管理',
  'status' => 1
], '1,2,3');

当createRole方法的第一个参数中包含了主键id时为编辑角色,第二个参数为权限节点的id拼接的字符串

(4)给用户分配角色

//实例化rbac
$rbac = new Rbac();
//给用户分配角色
$rbac->assignUserRole(1, [1]);

第一个参数为用户id,第二个参数为角色id的数组,此方法会先删除用户之前分配的角色,然后重新给用户分配角色

(5)获取权限分组列表

//实例化rbac
$rbac = new Rbac();
//获取权限分组列表
$rbac->getPermissionCategory([['status', '=', 1]]);//参数为权限分组表的条件

(6)获取权限列表

//实例化rbac
$rbac = new Rbac();
//获取权限列表
$rbac->getPermission([['status', '=', 1]]);//参数为权限表条件

(7)获取角色列表

//实例化rbac
$rbac = new Rbac();
//获取角色列表
$rbac->getRole([], true);

第一个参数为role表的条件,第二个参数为true时查询角色分配的所有权限id

(8)删除权限相关方法

删除权限分组
$rbac->delPermissionCategory([1,2,3,4]);
删除权限
$rbac->delPermission([1,2,3,4]);
删除角色
$rbac->delRole([1,2,3,4]);

(9)权限验证

[1]service方式

service方式因为要用到session一般要依赖于cookie,在用户登录后获取用户权限并将用户权限进行缓存

$rbac->cachePermission(1);//参数为登录用户的user_id,返回值为用户权限列表

验证,判断用户对于指定的节点是否具有权限:

$rbac->can('article/channel/list');

[2]jwt方式

jwt方式在前后端分离结构用的比较普遍。在用户登录后需要获取token,将下面方法获取到的token传递到前端

$rbac->generateToken(1);//第一个参数为登录的用户id,第二个参数为token有效期默认为7200秒,第三个参数为token前缀 返回结果为

返回值示例如下:

array(3) {
 ["token"] => string(32) "4c56b80f06d3d8810b97db33a1291694"
 ["refresh_token"] => string(32) "17914241bde6bfc46b20e643b2c58279"
 ["expire"] => int(7200)
}

使用refresh_token刷新权限,有效期内使用refresh_token来刷新授权

$rbac->refreshToken('17914241bde6bfc46b20e643b2c58279');

验证,前端将token传递到后端,后端校验用户是否具有指定节点权限

$rbac->can('article/channel/list');

总结

以上所述是小编给大家介绍的thinkPHP5使用Rabc实现权限管理,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

PHP 相关文章推荐
用PHP连接Oracle数据库
Oct 09 PHP
一个简单的PHP投票程序源码
Mar 11 PHP
php反弹shell实现代码
Apr 22 PHP
javascript,php获取函数参数对象的代码
Feb 03 PHP
php 文件上传类代码
Aug 06 PHP
php笔记之:php函数range() round()和list()的使用说明
Apr 26 PHP
如何使用FireFox插件FirePHP调试PHP
Jul 23 PHP
php如何控制用户对图片的访问 PHP禁止图片盗链
Mar 25 PHP
PHP文件系统管理(实例讲解)
Sep 19 PHP
TP3.2.3框架使用CKeditor编辑器在页面中上传图片的方法分析
Dec 31 PHP
PHP基于openssl实现非对称加密代码实例
Jun 19 PHP
PHP并发场景的三种解决方案代码实例
Feb 27 PHP
Thinkphp5框架ajax接口实现方法分析
Aug 28 #PHP
Thinkphp5框架实现图片、音频和视频文件的上传功能详解
Aug 27 #PHP
Thinkphp5框架使用validate实现验证功能的方法
Aug 27 #PHP
thinkPHP3.2使用RBAC实现权限管理的实现
Aug 27 #PHP
PHP如何将图片文件上传到另外一台服务器上
Aug 26 #PHP
PHP命名空间与自动加载机制的基础介绍
Aug 25 #PHP
php的命名空间与自动加载实现方法
Aug 25 #PHP
You might like
PHP 实例化类的一点摘记
2008/03/23 PHP
使用dump函数,给php加断点测试
2013/06/25 PHP
图解找出PHP配置文件php.ini的路径的方法
2014/08/20 PHP
PHP使用ODBC连接数据库的方法
2015/07/18 PHP
PHP会话操作之cookie用法分析
2016/09/28 PHP
yii通过小物件生成view的方法
2016/10/08 PHP
Yii2-GridView 中让关联字段带搜索和排序功能示例
2017/01/21 PHP
Yii2学习笔记之汉化yii设置表单的描述(属性标签attributeLabels)
2017/02/07 PHP
Laravel 5.5基于内置的Auth模块实现前后台登陆详解
2017/12/21 PHP
php中青蛙跳台阶的问题解决方法
2018/10/14 PHP
JS数组去重与取重的示例代码
2014/01/24 Javascript
js动态控制table的tr、td增加及删除的具体实现
2014/04/30 Javascript
详解vue express启动数据服务
2017/07/05 Javascript
Vue内容分发slot(全面解析)
2017/08/19 Javascript
javascript中call()、apply()的区别
2019/03/21 Javascript
JavaScript面试技巧之数组的一些不low操作
2019/03/22 Javascript
vue+element创建动态的form表单及动态生成表格的行和列
2019/05/20 Javascript
简单的Apache+FastCGI+Django配置指南
2015/07/22 Python
不到40行代码用Python实现一个简单的推荐系统
2019/05/10 Python
python下的opencv画矩形和文字注释的实现方法
2019/07/09 Python
PyTorch学习:动态图和静态图的例子
2020/01/06 Python
python用TensorFlow做图像识别的实现
2020/04/21 Python
利用CSS3的线性渐变linear-gradient制作边框的示例
2016/06/02 HTML / CSS
深入理解HTML的FormData对象
2016/05/17 HTML / CSS
DJI美国:消费类无人机领域的领导者
2018/04/27 全球购物
Eyeko美国:屡获殊荣的睫毛膏、眼线笔和眉妆
2018/07/05 全球购物
说出你对remoting 和webservice的理解和应用
2014/06/08 面试题
简历自我评价模版
2014/01/31 职场文书
捐赠仪式主持词
2014/03/19 职场文书
机械工程及其自动化专业求职信
2014/08/08 职场文书
求职自我评价范文100字
2014/09/23 职场文书
师德先进个人材料
2014/12/20 职场文书
2015年售后服务工作总结
2015/04/25 职场文书
买卖合同纠纷代理词
2015/05/25 职场文书
MySQL定时备份数据库(全库备份)的实现
2021/09/25 MySQL
SpringBoot集成Redis的思路详解
2021/10/16 Redis