当前位置:首页 > CMS教程 > Thinkphp > 列表

thinkPHP5使用Rabc实现权限管理

发布:smiling 来源: PHP粉丝网  添加日期:2021-12-13 14:15:35 浏览: 评论:0 

在之前我们已经了解了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提供了方法来帮我们自动创建我们所需要的表

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

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

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

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

(2):permission_category(权限分组表

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

(3):role(角色表)

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

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

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

(5):user(用户表)

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

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

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

2:rbac的相关操作

(1)创建权限分组

  1. //实例化rbac 
  2. $rbac = new Rbac(); 
  3. //创建权限分组 
  4. $rbac->savePermissionCategory([ 
  5.   'name' => '用户管理组'
  6.   'description' => '网站用户的管理'
  7.   'status' => 1 
  8. ]); 

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

(2)创建权限节点

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

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

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

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

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

(4)给用户分配角色

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

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

(5)获取权限分组列表

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

(6)获取权限列表

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

(7)获取角色列表

  1. //实例化rbac 
  2. $rbac = new Rbac(); 
  3. //获取角色列表 
  4. $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前缀 返回结果为

返回值示例如下:

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

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

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

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

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

Tags: thinkPHP5权限管理 Rabc权限管理

分享到: