在以前咱們已經瞭解了think3.2Rbac的權限管理操做,可是在thinkPHP5中thinkPHP沒有內置Rabc操做,因此咱們須要使用一個thinkPHP的Rbac拓展來實現權限管理,在thinkPHP中咱們可使用gmars/tp5-rbac拓展來實現權限管理前端
gmars/tp5-rbac地址:https://packagist.org/package...sql
一:gmars/tp5-rbac安裝數據庫
composer require gmars/tp5-rbac
二:gmars/tp5-rbac使用後端
1:Rbac數據庫建立api
在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所須要的表,通常只執行一次,爲了安全,執行後會加鎖,下次要執行須要刪除鎖文件再執行cookie
(1):權限節點表(permission)session
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');