tp5.1 的RBAC外掛安裝 及使用方法
之前自己安裝說明安裝,但是沒有看依賴關係,所以一直失敗。直到看到一篇部落格的介紹,才明白需要依賴外掛。特此轉載分享。
tp5.0版本不能使用
安裝方法
先安裝composer如果不知道怎麼安裝使用composer請自行百度。
開啟命令列工具切換到你的tp5專案根目錄
如果沒有安裝migaration與nestedset,先安裝
composer require topthink/think-migration:*
composer require gmars/tp5-nestedsets:dev-master
composer require gmars/tp5-rbac
- 1
如果該方法報錯請按照以下方式操作:
- 開啟專案根目錄下的composer.json
- 在require中新增”gmars/tp5-rbac”: “dev-master”
- 執行composer update
新增後composer.json應該有這樣的部分:
"require": {
"php": ">=5.4.0",
"topthink/framework": "^5.0",
"gmars/tp5-rbac": "dev-master"
},
- 1
- 2
- 3
- 4
- 5
資料遷移
在使用本外掛之前需要有rbac鎖需要的資料庫。在遷移之前如果你的資料庫中已有user資料表那麼請你備份自己的user資料表後刪除。
在你的專案的某個config.php中加入如下配置:
'migration' => [
'path' => ROOT_PATH .'vendor/gmars/tp5-rbac/'
],
- 1
- 2
- 3
然後把命令列切換到你的專案根目錄Windows是cmd執行如下命令
php think migrate:run
- 1
如果遷移執行成功會在你的資料庫中生成如下幾張表:
user 使用者表
user_role 使用者角色對應表
role 角色表
role_permission 角色許可權對應表
permission 角色表
- 1
- 2
- 3
- 4
- 5
使用該外掛–RBAC的管理
在一個系統中RBAC是基於角色的許可權控制。作為開發人員需要明白這是兩個不同的過程。第一個就是構建系統的RBAC結構,包括新增許可權,角色,使用者,使用者角色對應關係,角色許可權對應關係等。
在此先說明RBAC管理:
1.新增使用者
這一步是在使用者註冊時要做的一步,就是講註冊的使用者新增到user表中。
$rbacObj = new Rbac();
$data = ['user_name' => 'zhangsan', 'status' => 1, 'password' => md5('zhangsan')];
$rbacObj->createUser($data);
- 1
- 2
- 3
建立使用者時傳入唯一一個引數必須是陣列。陣列中應該包含使用者表需要的資料。如果出現其他非user表的欄位則會丟擲異常。
該方法返回的結果為false或者Exception或者新新增使用者的id。
2.新增許可權
這一步是構建系統的許可權。一般我們是以請求的路由為許可權的識別標誌。在該外掛中使用path欄位。
例如我們的系統中有商品列表這樣的一個操作需要授權。
其路由為 /index/goods/list
新增路由如下:
$rbacObj = new Rbac();
$data = [
'name' => '商品列表',
'status' => 1,
'description' => '檢視商品的所有列表',
'path' => '/index/goods/list',
'create_time' => time()
];
$rbacObj->createPermission($data);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
3.新增角色
在RBAC的角色中角色是有父子關係的,也就是說所新增的角色可以是另一個角色的子角色。
$rbacObj = new Rbac();
$data = [
'name' => '商品管理員',
'status' => 1,
'description' => '商品管理員負責商品的檢視修改刪除等操作',
'sort_num' => 10,
'parent_id' => 1
];
$rbacObj->createRole($data);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
需要注意的是在data中有個欄位為parent_id這個欄位標識了所要新增的角色的父角色。如果留為空則便是新增的父角色。
4.為使用者分配角色
當然一個使用者可以有多個角色。一般是使用多選框或其他形式選擇後以陣列的方式傳入的。
例如:
$rbacObj = new Rbac();
$rbacObj->assignUserRole(1, [1, 2]);
- 1
- 2
assignUserRole(userId,arrayroleArray = [])
該方法的第一個引數為使用者id第二個引數是一個一位陣列,其元素為角色的id
5.為角色分配許可權
例如:
$rbacObj = new Rbac();
$rbacObj->assignRolePermission(1, [1, 2]);
- 1
- 2
將id分別為1,2的許可權分配給id為1的角色
6.刪除角色
刪除角色的同時必須刪除角色和許可權的對應資料
$rbacObj = new Rbac();
$rbacObj->delRole(1);
- 1
- 2
其中需要傳入的是角色id
7.將一個角色移到另一個角色下
以上已經說明了角色是有父子關係的那麼肯定能夠移動其位置
$rbacObj = new Rbac();
$rbacObj->moveRole(1,3);
- 1
- 2
該例子是將id為1的角色移動到id為3的角色下作為子角色。
還有其他修改刪除等方法的文件日後再補全,功能是有的
使用該外掛–RBAC許可權驗證
登入後獲取許可權列表
如果自己寫許可權驗證則請忽略這一步,如果要使用rbac外掛來驗證許可權則必須要這樣做。
在登入成功後做如下操作:
$rbacObj = new Rbac();
$rbacObj->cachePermission(1);
- 1
- 2
這個方法是查詢id為1的使用者的所有許可權並且以path索引後存入cache
請求時的許可權驗證
當然對於每一個方法都要進行許可權驗證時我們一般是在某一個父類中定義一個方法進行許可權驗證,驗證如下:
$rbacObj = new Rbac();
$rbacObj->can('/index/goods/list');
- 1
- 2
該方法是驗證當前使用者有沒有操作/index/goods/list的許可權,如果有則返回true如果無則返回false
其中can的引數可以使用tp5的特性獲取。