当前位置: 首页 > 后端技术 > PHP

thinkPHP5使用Rabc实现权限管理

时间:2023-03-29 13:52:22 PHP

之前我们了解过think3.2Rbac的权限管理操作,但是在thinkPHP5中,thinkPHP并没有内置Rabc操作,所以我们需要使用一个thinkPHPRbac扩展来实现权限管理。在thinkPHP中,我们可以使用gmars/tp5-rbac扩展来实现权限管理gmars/tp5-rbac地址:https://packagist.org/package...1:gmars/tp5-rbacinstallcomposerrequiregmars/tp5-rbac2:使用gmars/tp5-rbac1:Rbac数据库在gmars/tp5-rbac中创建,我们需要用到六张表,分别是:权限节点表(permission)、permission_category(权限分组表)、role(角色表)、role_permission(角色权限关联表),user(用户表),user_role(用户角色关联表)我们使用composer下载gmars/tp5-rbac后,可以发现在vendorgmarstp5-rbac的目录下有一个gmars_rbac.sql文件,其中我们根据需要创建表sql下面的###是你的表前缀,下面只是展示我们需要的表sql,创建表gmars/tp5-rbac提供了方法来帮助我们自动创建我们需要的表//instantiaterbac$rbac=newRbac();//初始化rbac需要的表,可以通过in参数$db作为数据库配置项。如果默认为空,则为默认数据库(考虑多数据库的情况)$rbac->createTable();上面的方法会生成rbac需要的表,一般只执行一次,为了安全,执行完会加锁,下次需要删除锁文件再执行(一):权限节点表(permission)DROPTABLEIFEXISTS`###permission`;CREATETABLE`###permission`(`id`int(11)unsignedNOTNULLAUTO_INCREMENT,`name`varchar(50)NOTNULLDEFAULT''COMMENT'权限节点名称',`type`smallint(4)unsignedNOTNULLDEFAULT'0'COMMENT'Permissiontype1apipermission2beforeroutingpermission',`category_id`int(11)unsignedNOTNULLDEFAULT'0'COMMENT'Permissiongroupid',`path`varchar(100)NOTNULLDEFAULT''COMMENT'授权路径',`path_id`varchar(100)NOTNULLDEFAULT''COMMENT'路径唯一编码',`description`varchar(200)NOTNULLDEFAULT''COMMENT'描述信息',`status`smallint(4)unsignedNOTNULLDEFAULT'0'COMMENT'Status0NotEnabled1Normal',`create_time`int(10)unsignedNOTNULLDEFAULT'0'COMMENT'CreatedTime',PRIMARYKEY(`id`),KEY`idx_permission`(`path_id`,`status`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COMMENT='permissionnodetable';(2):permission_category(permissiongroupingtableSETFOREIGN_KEY_CHECKS=0;DROPTABLEIFEXISTS`###permission_category`;CREATETABLE`###permission_category`(`id`int(11)unsignedNOTNULLAUTO_INCREMENT,`name`varchar(50)COLLATEutf8mb4_general_ciNOTNULLDEFAULT''COMMENT'权限组名称e',`description`varchar(200)COLLATEutf8mb4_general_ciNNULLDEFAULT''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):角色(角色表)DROPTABLEIFEXISTS`###role`;CREATETABLE`###role`(`id`int(11)unsignedNOTNULLAUTO_INCREMENT,`name`varchar(50)NOTNULLDEFAULT''COMMENT'rolename',`description`varchar(200)NOTNULLDEFAULT''COMMENT'roledescription',`status`smallint(4)unsignedNOTNULLDEFAULT'0'COMMENT'status1normal0notenabled',`sort_num`int(11)unsignedNOTNULLDEFAULT'0'COMMENT'sortvalue',PRIMARYKEY(`id`),KEY`idx_role`(`status`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COMMENT='roletable';(4):role_permission(角色权限关联表)DROPTABLEIFEXISTS`###role_permission`;CREATETABLE`###role_permission`(`id`int(11)unsignedNOTNULLAUTO_INCREMENT,`role_id`int(11)unsignedNOTNULLDEFAULT'0'COMMENT'rolenumber',`permission_id`int(11)unsignedNOTNULLDEFAULT'0'COMMENT'权限编号',PRIMARYKEY(`id`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COMMENT='角色权限对应表';(5):user(usertable)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'Lastlogintime',`status`smallint(4)unsignedNOTNULLDEFAULT'0'COMMENT'state0disabled1normal',`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='userTable';(6):user_role(用户角色关联表)DROPTABLEIFEXISTS`###user_role`;CREATETABLE`###user_role`(`id`int(11)unsignedNOTNULLAUTO_INCREMENT,`user_id`int(11)unsignedNOTNULLDEFAULT'0'COMMENT'userid',`role_id`int(11)unsignedNOTNULLDEFAULT'0'COMMENT'roleid',PRIMARYKEY(`id`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COMMENT='用户角色对应';2:rbac相关操作(1)创建权限组//实例化rbac$rbac=newRbac();//创建权限组$rbac->savePermissionCategory(['name'=>'用户管理组','description'=>'网站用户管理','status'=>1]);当savePermissionCategory方法包含主键id时,为编辑权限组创建权限节点(二)//实例化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'=>'contentadministrator','description'=>'responsibleforwebsitecontentmanagement','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);第一个参数是角色表的条件,当第二个参数为真时,查询该角色分配的所有权限id(8)删除权限相关方法删除权限组$rbac->delPermissionCategory([1,2,3,4]);删除权限$rbac->delPermission([1,2,3,4]);删除角色$rbac->delRole([1,2,3,4]);(9)权限验证[1]服务方式服务方式一般依赖于cookies,因为使用的是session。用户登录后获取用户权限,并缓存用户权限。$rbac->cachePermission(1);//参数为登录用户的user_id,返回值用于用户权限列表校验,判断用户对指定节点是否有权限:$rbac->can('文章/频道/列表');[2]jwt模式jwt模式比较常用的是前后端分离结构。用户登录后需要获取token,将通过以下方法获取的token传递给前端$rbac->generateToken(1);//第一个参数为登录用户id,和第二个参数为令牌有效期,默认为7200秒,第三个参数为令牌前缀,返回结果为返回值示例如下:array(3){["token"]=>string(32)"4c56b80f06d3d8810b97db33a1291694"["refresh_token"]=>string(32)"17914241bde6bfc46b20e643b2c58279"["expire"]=>int(7200)}使用refresh_token刷新权限,有效期内使用refresh_token来刷新授权$rbac->refreshToken('17914241bde6bfc46b20e643b2c58279');Verification,thefrontendpassesthetokentothebackend,andthebackendverifieswhethertheuserhasthespecifiednodeauthority$rbac->can('article/channel/list');