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 相关文章推荐
JAVA/JSP学习系列之七
Oct 09 PHP
第七节--类的静态成员
Nov 16 PHP
PHP配置文件中最常用四个ini函数
Mar 19 PHP
PHPStrom中实用的功能和快捷键大全
Sep 23 PHP
PHP快速生成各种信息提示框的方法
Feb 03 PHP
PHP7标量类型declare用法实例分析
Sep 26 PHP
详解配置 Apache 服务器支持 PHP 文件的解析
Feb 15 PHP
PHP获取中国时间(上海时区时间)及美国时间的方法
Feb 23 PHP
PHP使用redis消息队列发布微博的方法示例
Jun 22 PHP
php从数据库读取数据,并以json格式返回数据的方法
Aug 21 PHP
PHP 数组黑名单/白名单实例代码详解
Jun 04 PHP
php反序列化长度变化尾部字符串逃逸(0CTF-2016-piapiapia)
Feb 15 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 中魔术常量的实例详解
2017/10/26 PHP
JavaScript 页面编码与浏览器类型判断代码
2010/06/03 Javascript
js 模拟气泡屏保效果代码
2010/07/10 Javascript
web网页按比例显示图片实现原理及js代码
2013/08/09 Javascript
javascript使用window.open提示“已经计划系统关机”的原因
2014/08/15 Javascript
jquery简单图片切换显示效果实现方法
2015/01/14 Javascript
在JavaScript中正确引用bind方法的应用
2015/05/11 Javascript
Javascript递归打印Document层次关系实例分析
2015/05/15 Javascript
正则表达式替换html元素属性的方法
2016/11/26 Javascript
基于JavaScript实现轮播图原理及示例
2020/04/10 Javascript
node.js平台下利用cookie实现记住密码登陆(Express+Ejs+Mysql)
2017/04/26 Javascript
React组件之间的通信的实例代码
2017/06/27 Javascript
JavaScript实现三级级联特效
2017/11/05 Javascript
JavaScript实现浅拷贝与深拷贝的方法分析
2018/07/05 Javascript
elementUI Tree 树形控件的官方使用文档
2019/04/25 Javascript
[01:08:17]2018DOTA2亚洲邀请赛3月29日 小组赛B组 EG VS VGJ.T
2018/03/30 DOTA
Python去除列表中重复元素的方法
2015/03/20 Python
matplotlib.pyplot画图 图片的二进制流的获取方法
2018/05/24 Python
详解Django rest_framework实现RESTful API
2018/05/24 Python
python微信公众号之关键词自动回复
2018/06/15 Python
Python3实现定时任务的四种方式
2019/06/03 Python
python的一些加密方法及python 加密模块
2019/07/11 Python
Python txt文件常用读写操作代码实例
2020/08/03 Python
python获取天气接口给指定微信好友发天气预报
2020/12/28 Python
Python实现王者荣耀自动刷金币的完整步骤
2021/01/22 Python
selenium+python实现基本自动化测试的示例代码
2021/01/27 Python
经典C++面试题一
2016/11/06 面试题
DIY手工制作经营店创业计划书
2014/02/01 职场文书
2014庆六一活动方案
2014/03/02 职场文书
2014年妇幼卫生工作总结
2014/12/09 职场文书
公司欠款证明
2015/06/24 职场文书
入队仪式主持词
2015/07/04 职场文书
2015年暑假生活总结
2015/07/13 职场文书
合作协议书格式范本
2016/03/21 职场文书
python常见的占位符总结及用法
2021/07/02 Python
Mysql开启外网访问
2022/05/15 MySQL