侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

thinkPHP5使用Rabc实现权限管理

ThinkPHP  /  管理员 发布于 8年前   174

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

您可能感兴趣的文章:

  • thinkPHP3.2使用RBAC实现权限管理的实现
  • thinkphp自定义权限管理之名称判断方法


  • 上一条:
    Thinkphp5框架简单实现钩子(Hook)行为的方法示例
    下一条:
    Thinkphp5框架ajax接口实现方法分析
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • thinkphp + mongodb项目中数据加载慢问题分析及解决(0个评论)
    • thinkphp6框架中封装redis操作类(0个评论)
    • thinkphp6框架中实现定时任务功能流程步骤(0个评论)
    • Thinkphp5.1框架中实现Session+Redis会话共享流程步骤(0个评论)
    • TP5框架版本5.0.10安全漏洞根据官方补丁修复,也是本站安全漏洞修复(0个评论)
    • 近期文章
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2017-07
    • 2017-08
    • 2017-09
    • 2017-10
    • 2017-12
    • 2018-01
    • 2018-02
    • 2020-03
    • 2021-07
    • 2021-12
    • 2022-05
    • 2022-06
    • 2022-09
    • 2023-01
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客