thinkPHP5使用Rabc實現(xiàn)權(quán)限管理
在之前我們已經(jīng)了解了think3.2Rbac的權(quán)限管理操作,但是在thinkPHP5中thinkPHP沒有內(nèi)置Rabc操作,所以我們需要使用一個thinkPHP的Rbac拓展來實現(xiàn)權(quán)限管理,在thinkPHP中我們可以使用gmars/tp5-rbac拓展來實現(xiàn)權(quán)限管理
gmars/tp5-rbac地址: https://packagist.org/package...
一:gmars/tp5-rbac安裝
composer require gmars/tp5-rbac
二:gmars/tp5-rbac使用
1:Rbac數(shù)據(jù)庫創(chuàng)建
在gmars/tp5-rbac中我們需要使用到六張表,分別為:權(quán)限節(jié)點表(permission),permission_category(權(quán)限分組表),role(角色表),role_permission(角色權(quán)限關(guān)聯(lián)表),user(用戶表),user_role(用戶角色關(guān)聯(lián)表)
當我們使用composer將gmars/tp5-rbac下載下來之后,我們可以發(fā)現(xiàn)在vendorgmarstp5-rbac目錄下有一個gmars_rbac.sql文件,此文件內(nèi)就為我們所需要創(chuàng)建表的sql
下面sql中###為你的表前綴,下面只是展示我們呢所需要的表sql,創(chuàng)建表gmars/tp5-rbac提供了方法來幫我們自動創(chuàng)建我們所需要的表
//實例化rbac $rbac = new Rbac(); //初始化rbac所需的表,可傳入?yún)?shù)$db為數(shù)據(jù)庫配置項默認為空則為默認數(shù)據(jù)庫(考慮到多庫的情形) $rbac->createTable();
上面的方法會生成rbac所需要的表,一般只執(zhí)行一次,為了安全,執(zhí)行后會加鎖,下次要執(zhí)行需要刪除鎖文件再執(zhí)行
(1):權(quán)限節(jié)點表(permission)
DROP TABLE IF EXISTS `###permission`; CREATE TABLE `###permission` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT NULL DEFAULT '' COMMENT '權(quán)限節(jié)點名稱', `type` smallint(4) unsigned NOT NULL DEFAULT '0' COMMENT '權(quán)限類型1api權(quán)限2前路由權(quán)限', `category_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '權(quán)限分組id', `path` varchar(100) NOT NULL DEFAULT '' COMMENT '權(quán)限路徑', `path_id` varchar(100) NOT NULL DEFAULT '' COMMENT '路徑唯一編碼', `description` varchar(200) NOT NULL DEFAULT '' COMMENT '描述信息', `status` smallint(4) unsigned NOT NULL DEFAULT '0' COMMENT '狀態(tài)0未啟用1正常', `create_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '創(chuàng)建時間', PRIMARY KEY (`id`), KEY `idx_permission` (`path_id`,`status`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='權(quán)限節(jié)點表';
(2):permission_category(權(quán)限分組表
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 '權(quán)限分組名稱', `description` varchar(200) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '權(quán)限分組描述', `status` smallint(4) unsigned NOT NULL DEFAULT '1' COMMENT '權(quán)限分組狀態(tài)1有效2無效', `create_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '權(quán)限分組創(chuàng)建時間', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT '權(quán)限分組表';
(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 '狀態(tài)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(角色權(quán)限關(guān)聯(lián)表)
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 '權(quán)限編號', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色權(quán)限對應(yīng)表';
(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 '狀態(tài)0禁用1正常', `create_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '賬號創(chuàng)建時間', `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(用戶角色關(guān)聯(lián)表)
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='用戶角色對應(yīng)關(guān)系';
2:rbac的相關(guān)操作
(1)創(chuàng)建權(quán)限分組
//實例化rbac $rbac = new Rbac(); //創(chuàng)建權(quán)限分組 $rbac->savePermissionCategory([ 'name' => '用戶管理組', 'description' => '網(wǎng)站用戶的管理', 'status' => 1 ]);
當savePermissionCategory方法中包含了主鍵id時為編輯權(quán)限分組
(2)創(chuàng)建權(quán)限節(jié)點
//實例化rbac $rbac = new Rbac(); //創(chuàng)建權(quán)限節(jié)點 $rbac->createPermission([ 'name' => '文章列表查詢', 'description' => '文章列表查詢', 'status' => 1, 'type' => 1,//type為權(quán)限類型1為后端權(quán)限2為前端權(quán)限 'category_id' => 1,//權(quán)限分組的id 'path' => 'article/content/list', ]);
當createPermission方法中包含了主鍵id時為編輯權(quán)限節(jié)點
(3)創(chuàng)建角色&給角色分配權(quán)限
//實例化rbac $rbac = new Rbac(); //創(chuàng)建角色&給角色分配權(quán)限 $rbac->createRole([ 'name' => '內(nèi)容管理員', 'description' => '負責網(wǎng)站內(nèi)容管理', 'status' => 1 ], '1,2,3');
當createRole方法的第一個參數(shù)中包含了主鍵id時為編輯角色,第二個參數(shù)為權(quán)限節(jié)點的id拼接的字符串
(4)給用戶分配角色
//實例化rbac $rbac = new Rbac(); //給用戶分配角色 $rbac->assignUserRole(1, [1]);
第一個參數(shù)為用戶id,第二個參數(shù)為角色id的數(shù)組,此方法會先刪除用戶之前分配的角色,然后重新給用戶分配角色
(5)獲取權(quán)限分組列表
//實例化rbac $rbac = new Rbac(); //獲取權(quán)限分組列表 $rbac->getPermissionCategory([['status', '=', 1]]);//參數(shù)為權(quán)限分組表的條件
(6)獲取權(quán)限列表
//實例化rbac $rbac = new Rbac(); //獲取權(quán)限列表 $rbac->getPermission([['status', '=', 1]]);//參數(shù)為權(quán)限表條件
(7)獲取角色列表
//實例化rbac $rbac = new Rbac(); //獲取角色列表 $rbac->getRole([], true);
第一個參數(shù)為role表的條件,第二個參數(shù)為true時查詢角色分配的所有權(quán)限id
(8)刪除權(quán)限相關(guān)方法
刪除權(quán)限分組 $rbac->delPermissionCategory([1,2,3,4]); 刪除權(quán)限 $rbac->delPermission([1,2,3,4]); 刪除角色 $rbac->delRole([1,2,3,4]);
(9)權(quán)限驗證
[1]service方式
service方式因為要用到session一般要依賴于cookie,在用戶登錄后獲取用戶權(quán)限并將用戶權(quán)限進行緩存
$rbac->cachePermission(1);//參數(shù)為登錄用戶的user_id,返回值為用戶權(quán)限列表
驗證,判斷用戶對于指定的節(jié)點是否具有權(quán)限:
$rbac->can('article/channel/list');
[2]jwt方式
jwt方式在前后端分離結(jié)構(gòu)用的比較普遍。在用戶登錄后需要獲取token,將下面方法獲取到的token傳遞到前端
$rbac->generateToken(1);//第一個參數(shù)為登錄的用戶id,第二個參數(shù)為token有效期默認為7200秒,第三個參數(shù)為token前綴 返回結(jié)果為
返回值示例如下:
array(3) {
["token"] => string(32) "4c56b80f06d3d8810b97db33a1291694"
["refresh_token"] => string(32) "17914241bde6bfc46b20e643b2c58279"
["expire"] => int(7200)
}
使用refresh_token刷新權(quán)限,有效期內(nèi)使用refresh_token來刷新授權(quán)
$rbac->refreshToken('17914241bde6bfc46b20e643b2c58279');
驗證,前端將token傳遞到后端,后端校驗用戶是否具有指定節(jié)點權(quán)限
$rbac->can('article/channel/list');
總結(jié)
以上所述是小編給大家介紹的thinkPHP5使用Rabc實現(xiàn)權(quán)限管理,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!
- thinkphp框架使用JWTtoken的方法詳解
- PHP如何使用JWT做Api接口身份認證的實現(xiàn)
- php實現(xiàn)JWT(json web token)鑒權(quán)實例詳解
- PHP JWT初識及其簡單示例
- php JWT在web端中的使用方法教程
- php 后端實現(xiàn)JWT認證方法示例
- thinkPHP5使用laypage分頁插件實現(xiàn)列表分頁功能
- Thinkphp5框架使用validate實現(xiàn)驗證功能的方法
- thinkphp5使用bootstrapvalidator進行異步驗證郵箱的示例
- 基于ThinkPHP5框架使用QueryList爬取并存入mysql數(shù)據(jù)庫操作示例
- ThinkPHP5框架中使用JWT的方法示例
相關(guān)文章
php array_reverse 以相反的順序返回數(shù)組實例代碼
本篇文章主要介紹了php array_reverse 以相反的順序返回數(shù)組實例代碼,具有一定的參考價值,有興趣的可以了解一下。2017-04-04
在 Laravel 6 中緩存數(shù)據(jù)庫查詢結(jié)果的方法
這篇文章主要介紹了在 Laravel 6 中緩存數(shù)據(jù)庫查詢結(jié)果的方法,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-12-12
仿dedecms下拉分頁樣式修改的thinkphp分頁類實例
這篇文章主要介紹了仿dedecms下拉分頁樣式修改的thinkphp分頁類,可實現(xiàn)類似dedecms下拉分頁樣式的效果,需要的朋友可以參考下2014-10-10

