thinkPHP5使用Rabc实现权限管理
在之前我们已经了解了think3.2Rbac的权限管理操作,但是在thinkPHP5中thinkPHP没有内置Rabc操作,所以我们需要使用一个thinkPHP的Rbac拓展来实现权限管理,在thinkPHP中我们可以使用gmars/tp5-rbac拓展来实现权限管理
gmars/tp5-rbac地址: https://packagist.org/package...
一:gmars/tp5-rbac安装
composerrequiregmars/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=newRbac(); //初始化rbac所需的表,可传入参数$db为数据库配置项默认为空则为默认数据库(考虑到多库的情形) $rbac->createTable();
上面的方法会生成rbac所需要的表,一般只执行一次,为了安全,执行后会加锁,下次要执行需要删除锁文件再执行
(1):权限节点表(permission)
DROPTABLEIFEXISTS`###permission`; CREATETABLE`###permission`( `id`int(11)unsignedNOTNULLAUTO_INCREMENT, `name`varchar(50)NOTNULLDEFAULT''COMMENT'权限节点名称', `type`smallint(4)unsignedNOTNULLDEFAULT'0'COMMENT'权限类型1api权限2前路由权限', `category_id`int(11)unsignedNOTNULLDEFAULT'0'COMMENT'权限分组id', `path`varchar(100)NOTNULLDEFAULT''COMMENT'权限路径', `path_id`varchar(100)NOTNULLDEFAULT''COMMENT'路径唯一编码', `description`varchar(200)NOTNULLDEFAULT''COMMENT'描述信息', `status`smallint(4)unsignedNOTNULLDEFAULT'0'COMMENT'状态0未启用1正常', `create_time`int(10)unsignedNOTNULLDEFAULT'0'COMMENT'创建时间', PRIMARYKEY(`id`), KEY`idx_permission`(`path_id`,`status`) )ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COMMENT='权限节点表';
(2):permission_category(权限分组表
SETFOREIGN_KEY_CHECKS=0; DROPTABLEIFEXISTS`###permission_category`; CREATETABLE`###permission_category`( `id`int(11)unsignedNOTNULLAUTO_INCREMENT, `name`varchar(50)COLLATEutf8mb4_general_ciNOTNULLDEFAULT''COMMENT'权限分组名称', `description`varchar(200)COLLATEutf8mb4_general_ciNOTNULLDEFAULT''COMMENT'权限分组描述', `status`smallint(4)unsignedNOTNULLDEFAULT'1'COMMENT'权限分组状态1有效2无效', `create_time`int(10)unsignedNOTNULLDEFAULT'0'COMMENT'权限分组创建时间', PRIMARYKEY(`id`) )ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COLLATE=utf8mb4_general_ciCOMMENT'权限分组表';
(3):role(角色表)
DROPTABLEIFEXISTS`###role`; CREATETABLE`###role`( `id`int(11)unsignedNOTNULLAUTO_INCREMENT, `name`varchar(50)NOTNULLDEFAULT''COMMENT'角色名', `description`varchar(200)NOTNULLDEFAULT''COMMENT'角色描述', `status`smallint(4)unsignedNOTNULLDEFAULT'0'COMMENT'状态1正常0未启用', `sort_num`int(11)unsignedNOTNULLDEFAULT'0'COMMENT'排序值', PRIMARYKEY(`id`), KEY`idx_role`(`status`) )ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COMMENT='角色表';
(4):role_permission(角色权限关联表)
DROPTABLEIFEXISTS`###role_permission`; CREATETABLE`###role_permission`( `id`int(11)unsignedNOTNULLAUTO_INCREMENT, `role_id`int(11)unsignedNOTNULLDEFAULT'0'COMMENT'角色编号', `permission_id`int(11)unsignedNOTNULLDEFAULT'0'COMMENT'权限编号', PRIMARYKEY(`id`) )ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COMMENT='角色权限对应表';
(5):user(用户表)
DROPTABLEIFEXISTS`###user`; CREATETABLE`###user`( `id`int(11)unsignedNOTNULLAUTO_INCREMENT, `user_name`varchar(50)NOTNULLDEFAULT''COMMENT'用户名', `password`varchar(64)NOTNULLDEFAULT''COMMENT'用户密码', `mobile`varchar(20)NOTNULLDEFAULT''COMMENT'手机号码', `last_login_time`int(10)unsignedNOTNULLDEFAULT'0'COMMENT'最后一次登录时间', `status`smallint(4)unsignedNOTNULLDEFAULT'0'COMMENT'状态0禁用1正常', `create_time`int(10)unsignedNOTNULLDEFAULT'0'COMMENT'账号创建时间', `update_time`int(10)unsignedNOTNULLDEFAULT'0'COMMENT'信息更新时间', PRIMARYKEY(`id`), KEY`idx_user`(`user_name`,`mobile`,`status`) )ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COMMENT='用户表';
(6):user_role(用户角色关联表)
DROPTABLEIFEXISTS`###user_role`; CREATETABLE`###user_role`( `id`int(11)unsignedNOTNULLAUTO_INCREMENT, `user_id`int(11)unsignedNOTNULLDEFAULT'0'COMMENT'用户id', `role_id`int(11)unsignedNOTNULLDEFAULT'0'COMMENT'角色id', PRIMARYKEY(`id`) )ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COMMENT='用户角色对应关系';
2:rbac的相关操作
(1)创建权限分组
//实例化rbac $rbac=newRbac(); //创建权限分组 $rbac->savePermissionCategory([ 'name'=>'用户管理组', 'description'=>'网站用户的管理', 'status'=>1 ]);
当savePermissionCategory方法中包含了主键id时为编辑权限分组
(2)创建权限节点
//实例化rbac $rbac=newRbac(); //创建权限节点 $rbac->createPermission([ 'name'=>'文章列表查询', 'description'=>'文章列表查询', 'status'=>1, 'type'=>1,//type为权限类型1为后端权限2为前端权限 'category_id'=>1,//权限分组的id 'path'=>'article/content/list', ]);
当createPermission方法中包含了主键id时为编辑权限节点
(3)创建角色&给角色分配权限
//实例化rbac $rbac=newRbac(); //创建角色&给角色分配权限 $rbac->createRole([ 'name'=>'内容管理员', 'description'=>'负责网站内容管理', 'status'=>1 ],'1,2,3');
当createRole方法的第一个参数中包含了主键id时为编辑角色,第二个参数为权限节点的id拼接的字符串
(4)给用户分配角色
//实例化rbac $rbac=newRbac(); //给用户分配角色 $rbac->assignUserRole(1,[1]);
第一个参数为用户id,第二个参数为角色id的数组,此方法会先删除用户之前分配的角色,然后重新给用户分配角色
(5)获取权限分组列表
//实例化rbac $rbac=newRbac(); //获取权限分组列表 $rbac->getPermissionCategory([['status','=',1]]);//参数为权限分组表的条件
(6)获取权限列表
//实例化rbac $rbac=newRbac(); //获取权限列表 $rbac->getPermission([['status','=',1]]);//参数为权限表条件
(7)获取角色列表
//实例化rbac $rbac=newRbac(); //获取角色列表 $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实现权限管理,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!