tp5-rbac
本擴展包是tp5的rbac包,使用了部分tp5的特性實現了關系型數據庫中特殊數據結構的處理。
安裝方法
先安裝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(userIroleArray = [])
該方法的第一個參數為用戶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的特性獲取。