thinkPHP5使用Rabc实现权限管理的具体方法

  • 更新时间:2020-06-14 06:51:54
  • 编辑:高和歌

在之前我们已经了解了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实现权限管理,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对码农之家网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

相关教程

  • jquery+thinkphp实现跨抓取数据的方法

    这篇文章主要介绍了jquery+thinkphp实现跨域抓取数据的方法,结合实例形式分析了thinkPHP结合jQuery的ajax实现跨域抓取数据的相关操作技巧,需要的朋友可以参考下

    发布时间:2019-06-06

  • thinkphp3.2嵌入百度编辑器ueditor实例方法

    本篇文章主要介绍了thinkphp3.2嵌入百度编辑器ueditor的实例代码,具有一定的参考价值,有兴趣的可以了解一下

    发布时间:2019-06-06

  • ThinkPHP实现图片按比例切割的具体方法和代码

    今天小编就为大家分享一篇关于ThinkPHP中图片按比例切割的代码实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

    发布时间:2019-11-09

  • ThinkPHP的模板引擎如何达到最佳效率

    这篇文章主要介绍了让ThinkPHP的模板引擎达到最佳效率的方法,结合实例形式较为详细的分析了thinkPHP模板引擎的使用方法与使用原生态php语法的效率问题,需要的朋友可以参考下

    发布时间:2019-06-18

  • thinkphp5框架实现的自定义扩展类操作方法

    这篇文章主要介绍了thinkphp5框架实现的自定义扩展类操作,结合实例形式简单分析了thinkPHP5在extend目录下建立自定义扩展类的具体操作步骤与相关实现技巧,需要的朋友可以参考下

    发布时间:2019-07-08

  • ThinkPHP5.1表单令牌Token失效的解决方法

    这篇文章主要给大家介绍了关于ThinkPHP5.1表单令牌Token失效问题的解决方法,文中通过示例代码介绍的非常详细,对大家学习或者使用ThinkPHP具有一定的参考学习价值,需要的朋友们下面来一起学

    发布时间:2019-07-31

  • ThinkPHP3.2.3框架执行原生SQL语句的方法代码实例

    这篇文章主要介绍了ThinkPHP3.2.3框架实现执行原生SQL语句的方法,结合实例形式分析了thinkPHP3.2.3框架针对查询、添加、修改、删除等原生SQL操作相关实现技巧,需要的朋友可以参考下

    发布时间:2019-07-02

  • Thinkphp框架表单ajax自动验证登录注册功能

    这篇文章主要介绍了Thinkphp框架 表单自动验证登录注册 ajax自动验证登录注册的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下

    发布时间:2019-06-06

  • PHP核心技术与最佳实践

    PHP核心技术与最佳实践

    《PHP核心技术与最佳实践》系统归纳和深刻解读PHP开发中的编程思想、底层原理、核心技术、开发技巧、编码规范和**实践,为PHP程序员进阶修炼提供全面而高效的指导!

    大小:197.3 MBPHP技术与实践电子书

  • PHP Zend Framework项目开发基础案例教程

    PHP Zend Framework项目开发基础案例教程

    《PHP Zend Framework项目开发基础案例教程》以实际项目——XX办公自动化管理系统的开发——为案例,详细介绍使用PHP的企业级框架Zend Framework进行Web应用开发的步骤及关键技术。全书共12章

    大小:65 MBPHP电子书

  • 写给PHP开发者的Node.js学习指南

    写给PHP开发者的Node.js学习指南

    Node.js是一套用来编写高性能网络服务器的JavaScript工具包。结合PHP和Node.js,我们可以概览整个Web服务器从起源到现在的历史过程以及其中的改变。 《 写给PHP开发者的Node.js学习指南 》的目的是

    大小:3.46 MBNode.js电子书

  • PHP经典实例(第3版)

    PHP经典实例(第3版)

    PHP经典实例(第3版)介绍了专门为PHP 5.4和5.5修订的350个经典技巧,并提供了丰富的示例代码。可以免费使用,另外还讨论了如何解决问题以及这些解决方案为什么可行,希望会对大家有帮助

    大小:55.9 MBPHP实例电子书

  • Modern PHP

    Modern PHP

    本书让你会学到关于应用架构、规划、数据库、安全、测试、调试和部署方面的很好实践。如果你具有PHP基础知识,想提高自己的技能,不要错过这本书

    大小:28 MBPHP电子书

  • PHP7.0+MySQL网站开发全程实例

    PHP7.0+MySQL网站开发全程实例

    《 PHP7.0MySQL网站开发全程实例 》在XAMPP集成化自然环境下,应用Dreamweaver对PHP动态网站开发。《PHP7.0MySQL网站开发全程实例》以全程实例课堂教学为设计方案总体目标,从网站开发自然环境的配

    大小:165.8 MB网站设计电子书

  • Learning PHP设计模式

    Learning PHP设计模式

    本书是PHP设计模式的经典教程,让读者掌握更精巧的编程风格。本书利用大量浅显易懂的例子告诉你如何应用多种面向对象模式,并展示了这些模式在一些成熟的实际项目中的具体应用,欢迎免费下载

    大小:39.4 MBPHP编程电子书

  • PHP基础教程

    PHP基础教程

    本书以通俗易懂的语言向初学者介绍了PHP语言的基本概念、使用方法和注意事项。全书通过丰富的示例,引领读者逐步掌握这门流行的Web开发语言,使读者能够上手编写适用于常用场景的PHP脚

    大小:25.3 MBPHP教程

  • PHP编程入门与应用

    PHP编程入门与应用

    在近几年中,PHP已经发展成为世界上最为流行的Web平台,它运行在全球超过1/3的Web服务器上。PHP的发展不仅是数量上的,也是质量上的。越来越多的公司,包括全球500强榜上的公司都依靠PHP来

    大小:500 MBPHP编程电子书

  • PHP、MySQL与JavaScript学习手册(第4版)

    PHP、MySQL与JavaScript学习手册(第4版)

    本书有借助面向对象的编程基础,深入学习PHP。研究MySQL,从数据库结构到复杂查询。掌握JavaScript语言,以及带有jQuery的增强功能。调用Ajax进行后台浏览器/服务器通信等,欢迎免费下载

    大小:76 MBPHP学习手册电子书

用户留言