thinkPHP5使用Rabc实现权限管理
在之前我们已经了解了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实现权限管理,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对ZaLou.Cn网站的支持! 如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
- vscode编写插件详细过程
- zabbix最新SQL注入漏洞+EXP
- 本地密码检索工具 – LaZagne Project
- 我是如何在SQLServer中处理每天四亿三千万记录的
- 程序猿是如何解决SQLServer占CPU100%的
- 记一次SQLServer的分页优化兼谈谈使用Row_Number()分页存在的问题
- 分享一个自制的 .net线程池1
- 分享一个自制的 .net线程池2
- 基于百度翻译的简单爬虫翻译-- coding:utf-8 --访问网址模拟浏览器创建文件夹用一个text文件保存,文件名用单词名字
- .net采集网页方法大全(5种)
- C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子)
- 中文分词之结巴分词~~~附使用场景+demo(net)
- 用微信二维码登录自己的网站
- 2620: [Usaco2012 Mar]Haybale Restacking
- php概述
- php教程
- php环境搭建
- PHP书写格式
- php变量
- php常量
- PHP注释
- php数组
- php字符串 string
- PHP整型 integer
- PHP浮点型 float
- php布尔型
- php数据类型之数组
- php数据类型之对象
- php数据类型之null
- php数据类型之间的转换
- php运算符
- php表达式
- PHP循环控制
- PHP流程控制
- php函数
- php全局变量
- PHP魔术变量
- php命名空间
- php 日期
- PHP包含文件
- php文件
- PHP 文件上传
- php Cookies
- php Sessions
- php email
- php安全email
- php错误处理
- PHP异常处理
- php过滤器
- PHP 高级过滤器
- php json
- php 表单
- PHP MySQL 简介
- PHP 连接 MySQL
- php创建数据库
- php 创建表
- php mysq 插入数据
- PHP MySQL 插入多条数据
- PHP MySQL 预处理语句
- php mysql 读取数据
- php mysql where
- PHP MySQL Order By
- PHP MySQL Update
- PHP MySQL Delete
- php ODBC
- 为什么你每次被问到HashMap底层原理都一知半解,搞定它
- 要想精通java,你必须得知道java的内存模型,不忽悠
- java类加载机制,再也不怕面试官的刁难
- 前端科普系列(4):Babel —— 把 ES6 送上天的通天塔
- JVM技术总结之五——JVM逃逸分析
- React源码解读【二】更新创建
- JVM技术总结之六——JVM的锁优化
- 每日两题 T12
- 删除列中的 NULL 值
- Linux生产环境CPU使用率100%,教你定位到具体函数
- Nginx技术总结之二——Nginx进程模型
- 「PostgreSQL技巧」Citus实时执行程序如何并行化查询
- Nginx技术总结之四——集群和负载均衡的算法与实现
- SQL 找出 100 以内的质数
- SQL 获取最长的日期序列