laravel-permission 角色權限控制【代碼詳解】

下面由laravel教程欄目給大家介紹laravel-permission 角色權限控制,希望對需要的朋友有所幫助!

laravel-permission 角色權限控制【代碼詳解】

首先還是貼出GitHub的地址

https://github.com/spatie/laravel-permission

然后說一下使用心得

先說數據庫的表結構把一共有6張表,也可以根據可以喜好添加,修改刪除表,不過我們還是先列出表!

首先是用戶表(users)不用說了都是一些基本信息包括名字,郵箱什么的!

權限表(permissions)權限表就是存放所有權限的一張表,權限可以是控制器訪問權限,接口訪問權限,model訪問權限,在這里我們只討論接口訪問權限!

角色表(roles)角色表就是存放你所有的角色,角色的名字為索引!

基本的表有了,那他們是怎么關聯的呢?請繼續往下看!

用戶擁有權限表(model_has_permissions)這張表記錄的就是user_id,permission_id的多對多的關系表,用戶直接獲取權限。

用戶擁有角色表(model_has_roles)這張表記錄的用戶擁有的權限,表里有user_id,role_id這個也是記錄用戶和角色多對多的關系表,也可以理解為中間表!

角色擁有權限表(role_has_permissions)這張表記錄的是角色擁有哪些權限,表里就2個字段role_id,permission_id!也可以根據需要進行拓展!

下面給出一張圖,來直觀的看下各個關聯關系:

laravel-permission 角色權限控制【代碼詳解】

用戶直接擁有權限,model_has_permissions,用戶擁有角色那么就是model_has_role然后到roles表中role_has_permission

如何添加角色(依賴包提供了方法)

$role = Role::Create(['name' => 'add_title']);

Create有幾個參數呢?原方法中有一個name和guard_name,如下面代碼

use?SpatiePermissionModelsRole; public?static?function?create(array?$attributes?=?[]) { ????$attributes['guard_name']?=?$attributes['guard_name']????config('auth.defaults.guard');  ????if?(static::where('name',?$attributes['name'])->where('guard_name',?$attributes['guard_name'])->first())?{ ????????throw?RoleAlreadyExists::create($attributes['name'],?$attributes['guard_name']); ????}  ????if?(isNotLumen()?&&?app()::VERSION?create($attributes); }

我們也可以不用這個方法,去調用它原有的task也可以,比如項目初始化自帶的seeder中就調用task

namespace?AppContainersAuthorizationDataSeeders; Apiato::call('Authorization@CreateRoleTask',?['admin',?'Administrator',?'Administrator?Role',?999,'admin']);

跟著命名空間地址去找就能找到seeder、這個task也在Authorization下面Task里面、可以自己修改Task來符合自己的需求!

如何添加權限(依賴包也提供了方法)

$ permission  =  Permission :: create([ ' name '  =>  ' edit articles ' ]);

跟role一樣也可以找到一個寫好的Task以及它的create方法!在這里就不過多說了!

如何直接給用戶添加權限,刪除權限,判斷是否有權限

//可以授予任何用戶權限: $ user - > givePermissionTo(' edit articles ');  //你也可以一次給多個權限 $ user - > givePermissionTo( ' edit articles ', ' delete articles ');  //你也可以傳遞數組 $ user - > givePermissionTo([ ' edit articles ', ' delete articles ' ]);
//權限可以從用戶撤銷: $ user - > revokePermissionTo(' edit articles ');
//或者一次性撤消并添加新的權限: $ user - > syncPermissions([ ' edit articles ',' delete articles ' ]);
//您可以測試用戶是否有權限: $ user - > hasPermissionTo(' edit articles ');
//測試用戶有多個權限: $ user - > hasAnyPermission([ ' edit articles ',' publish articles ',' unpublish articles ' ]);
//您可以使用Laravel的默認can功能測試用戶是否具有權限: $ user - > can(' edit articles ');

如何通過角色使用權限

//角色可以分配給任何用戶: $ user - > assignRole(' writer ');  //你也可以一次賦值多個角色 $ user - > assignRole( ' writer ', ' admin ');
//或者作為一個數組 $ user - > assignRole([ ' writer ', ' admin ' ]);
//角色可以從用戶中刪除: $ user - > removeRole(' writer ');
//角色也可以同步: //所有當前角色將被從用戶中刪除,而由傳入的數組取代 $ user - > syncRoles([ ' writer ', ' admin ' ]);
//您可以確定用戶是否具有某個角色: $ user - > hasRole(' writer ');
//您還可以確定用戶是否有任何給定的角色列表: $ user - > hasAnyRole(Role :: all());
//您還可以確定用戶是否具有所有給定的角色列表: $ user - > hasAllRoles(Role :: all());
//assignRole,hasRole,hasAnyRole,hasAllRoles 和removeRole函數可以接受一個字符串,
//一個SpatiePermissionModelsRole對象或一個IlluminateSupportCollection對象。  //可以給角色一個許可: $ role - > givePermissionTo(' edit articles ');
//您可以確定角色是否具有某種權限: $ role - > hasPermissionTo(' edit articles ');
//權限可以從角色中被撤銷: $ role - > revokePermissionTo(' edit articles ');
//該givePermissionTo和revokePermissionTo函數可以接受字符串或SpatiePermissionModelsPermission對象。 //權限是從角色自動繼承的。另外,個人權限也可以分配給用戶。例如: $ role  =  Role :: findByName(' writer ');  $ role - > givePermissionTo(' edit articles '); $ user - > assignRole(' writer '); $ user - > givePermissionTo(' delete articles ');
//在上面的例子中,角色被授予編輯文章的權限,并且該角色被分配給用戶。現在,用戶可以編輯文章并刪除文章。
//“刪除文章”的權限是直接分配給用戶的直接權限。
//當我們調用$user->hasDirectPermission('delete articles')它返回true,
//但false對$user->hasDirectPermission('edit articles')。 //如果為應用程序中的角色和用戶設置權限并希望限制或更改用戶角色的繼承權限(即,僅允許更改用戶的直接權限),則此方法非常有用。 //您可以列出所有這些權限: //直接權限 $ user - > getDirectPermissions() //或$ user-> permissions;  //從用戶角色繼承的權限 $ user - > getPermissionsViaRoles();  //所有適用于用戶的權限(繼承和直接) $ user - > getAllPermissions(); //所有這些響應都是SpatiePermissionModelsPermission對象的集合。 //如果我們按照前面的例子,第一個響應將是一個具有delete article權限的集合,
//第二個響應將是一個具有權限的集合,edit article第三個將包含這兩個集合。

在哪兒做限制,在哪兒使用

首先你可以在action中檢測這個用戶有沒有這項權限!

你還可以在request中使用,當用戶請求一個接口時、系統會去判斷用戶是否擁有通過這個接口的權限和角色!

這個request當然要在接口調用方法的時候注入進去!

下面給出位置

namespace?AppContainersAuthorizationUIAPIRequests; /** ?*?Define?which?Roles?and/or?Permissions?has?access?to?this?request. ?* ?*?@var??array ?*/ protected?$access?=?[ ????'permissions'?=>?'add-permission-byRole', ????'roles'???????=>?'', ];

總結:

laravel有幾個角色權限控制,但是我選擇這個,laravel-permission好搜索、不是因為誰好誰差的!總的來說角色權限就角色表和權限表,然后就是用戶、角色、權限的關系維護!其實也可以不用他自帶的方法!

基本表的關系都是多對多可以使用attach和detch、sync來維護他們之間的關系!

如果自己玩得夠熟悉了,也不需要他的關系表,完全可以自己寫好來實現這一成的關系!

? 版權聲明
THE END
喜歡就支持一下吧
點贊7 分享