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和XSL stylesheets转换XML文档
Oct 09 PHP
第二节--PHP5 的对象模型
Nov 16 PHP
解决MySQL中文输出变成问号的问题
Jun 05 PHP
探讨:array2xml和xml2array以及xml与array的互相转化
Jun 24 PHP
php addslashes 利用递归实现使用反斜线引用字符串
Aug 05 PHP
yii2.0之GridView自定义按钮和链接用法
Dec 15 PHP
php通过sort()函数给数组排序的方法
Mar 18 PHP
一张表搞清楚php is_null、empty、isset的区别
Jul 07 PHP
基于PHP代码实现中奖概率算法可用于刮刮卡、大转盘等抽奖算法
Dec 20 PHP
php结合mysql与mysqli扩展处理事务的方法
Jun 29 PHP
php修改数组键名的方法示例
Apr 15 PHP
PHP对称加密算法(DES/AES)类的实现代码
Nov 14 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与Java进行通信的实现方法
2013/10/21 PHP
PHP中shuffle数组值随便排序函数用法
2014/11/21 PHP
php页面函数设置超时限制的方法
2014/12/01 PHP
为百度UE编辑器上传图片添加水印功能
2015/04/16 PHP
PHP创建XML的方法示例【基于DOMDocument类及SimpleXMLElement类】
2019/09/10 PHP
laravel 解决强制跳转 https的问题
2019/10/22 PHP
Jquery拖拽并简单保存的实现代码
2010/11/28 Javascript
jQuery基础框架浅入剖析
2012/12/27 Javascript
node.js中的fs.chmod方法使用说明
2014/12/18 Javascript
JavaScript基础函数整理汇总
2015/01/30 Javascript
js判断手机浏览器操作系统和微信浏览器的方法
2016/04/30 Javascript
深入理解setTimeout函数和setInterval函数
2016/05/20 Javascript
jquery常用的12个小功能
2016/07/22 Javascript
JavaScript实现拖拽元素对齐到网格(每次移动固定距离)
2016/11/30 Javascript
Angularjs过滤器实现动态搜索与排序功能示例
2017/12/13 Javascript
云服务器部署Node.js项目的方法步骤(小白系列)
2020/03/23 Javascript
实例讲解React 组件生命周期
2020/07/08 Javascript
[56:41]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 Newbee vs OG
2018/04/01 DOTA
python实现域名系统(DNS)正向查询的方法
2016/04/19 Python
python实现excel读写数据
2021/03/02 Python
python检测空间储存剩余大小和指定文件夹内存占用的实例
2018/06/11 Python
python循环定时中断执行某一段程序的实例
2019/06/29 Python
python操作excel让工作自动化
2019/08/09 Python
python实现知乎高颜值图片爬取
2019/08/12 Python
Python matplotlib绘制饼状图功能示例
2019/09/10 Python
HTML5 device access 设备访问详解
2018/05/24 HTML / CSS
Hurley官方网站:扎根于海滩生活方式的全球青年文化品牌
2020/05/18 全球购物
人事主管的岗位职责
2013/11/16 职场文书
产品质量保证书
2014/04/29 职场文书
机械设计制造及其自动化专业求职信
2014/06/17 职场文书
班级文化标语
2014/06/23 职场文书
毕业生工作求职信
2014/06/30 职场文书
护理医院见习报告
2014/11/03 职场文书
2017元旦、春节期间廉洁自律承诺书
2016/03/25 职场文书
解决Python字典查找报Keyerror的问题
2021/05/26 Python
pytorch fine-tune 预训练的模型操作
2021/06/03 Python