溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

laravel-permission角色權(quán)限控制的示例

發(fā)布時(shí)間:2021-01-29 14:51:13 來(lái)源:億速云 閱讀:325 作者:小新 欄目:編程語(yǔ)言

這篇文章給大家分享的是有關(guān)laravel-permission角色權(quán)限控制的示例的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。

首先還是貼出GitHub的地址

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

然后說(shuō)一下使用心得

先說(shuō)數(shù)據(jù)庫(kù)的表結(jié)構(gòu)把一共有6張表,也可以根據(jù)可以喜好添加,修改刪除表,不過(guò)我們還是先列出表!

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

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

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

基本的表有了,那他們是怎么關(guān)聯(lián)的呢?請(qǐng)繼續(xù)往下看!

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

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

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

下面給出一張圖,來(lái)直觀的看下各個(gè)關(guān)聯(lián)關(guān)系:

laravel-permission角色權(quán)限控制的示例

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

如何添加角色(依賴包提供了方法)
$role = Role::Create(['name' => 'add_title']);

Create有幾個(gè)參數(shù)呢?原方法中有一個(gè)name和guard_name,如下面代碼

use Spatie\Permission\Models\Role;
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 < '5.4') {
        return parent::create($attributes);
    }

    return static::query()->create($attributes);
}

我們也可以不用這個(gè)方法,去調(diào)用它原有的task也可以,比如項(xiàng)目初始化自帶的seeder中就調(diào)用task

namespace App\Containers\Authorization\Data\Seeders;
Apiato::call('Authorization@CreateRoleTask', ['admin', 'Administrator', 'Administrator Role', 999,'admin']);

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

如何添加權(quán)限(依賴包也提供了方法)
$ permission  =  Permission :: create([ ' name '  =>  ' edit articles ' ]);

跟role一樣也可以找到一個(gè)寫(xiě)好的Task以及它的create方法!在這里就不過(guò)多說(shuō)了!

如何直接給用戶添加權(quán)限,刪除權(quán)限,判斷是否有權(quán)限
//可以授予任何用戶權(quán)限:
$ user - > givePermissionTo(' edit articles ');

//你也可以一次給多個(gè)權(quán)限
$ user - > givePermissionTo( ' edit articles ', ' delete articles ');

//你也可以傳遞數(shù)組
$ user - > givePermissionTo([ ' edit articles ', ' delete articles ' ]);
//權(quán)限可以從用戶撤銷:
$ user - > revokePermissionTo(' edit articles ');
//或者一次性撤消并添加新的權(quán)限:
$ user - > syncPermissions([ ' edit articles ',' delete articles ' ]);
//您可以測(cè)試用戶是否有權(quán)限:
$ user - > hasPermissionTo(' edit articles ');
//測(cè)試用戶有多個(gè)權(quán)限:
$ user - > hasAnyPermission([ ' edit articles ',' publish articles ',' unpublish articles ' ]);
//您可以使用Laravel的默認(rèn)can功能測(cè)試用戶是否具有權(quán)限:
$ user - > can(' edit articles ');
如何通過(guò)角色使用權(quán)限
//角色可以分配給任何用戶:
$ user - > assignRole(' writer ');

//你也可以一次賦值多個(gè)角色
$ user - > assignRole( ' writer ', ' admin ');
//或者作為一個(gè)數(shù)組
$ user - > assignRole([ ' writer ', ' admin ' ]);
//角色可以從用戶中刪除:
$ user - > removeRole(' writer ');
//角色也可以同步:
//所有當(dāng)前角色將被從用戶中刪除,而由傳入的數(shù)組取代
$ user - > syncRoles([ ' writer ', ' admin ' ]);
//您可以確定用戶是否具有某個(gè)角色:
$ user - > hasRole(' writer ');
//您還可以確定用戶是否有任何給定的角色列表:
$ user - > hasAnyRole(Role :: all());
//您還可以確定用戶是否具有所有給定的角色列表:
$ user - > hasAllRoles(Role :: all());
//assignRole,hasRole,hasAnyRole,hasAllRoles 和removeRole函數(shù)可以接受一個(gè)字符串,
//一個(gè)\Spatie\Permission\Models\Role對(duì)象或一個(gè)\Illuminate\Support\Collection對(duì)象。

//可以給角色一個(gè)許可:
$ role - > givePermissionTo(' edit articles ');
//您可以確定角色是否具有某種權(quán)限:
$ role - > hasPermissionTo(' edit articles ');
//權(quán)限可以從角色中被撤銷:
$ role - > revokePermissionTo(' edit articles ');
//該givePermissionTo和revokePermissionTo函數(shù)可以接受字符串或Spatie\Permission\Models\Permission對(duì)象。
//權(quán)限是從角色自動(dòng)繼承的。另外,個(gè)人權(quán)限也可以分配給用戶。例如:
$ role  =  Role :: findByName(' writer '); 
$ role - > givePermissionTo(' edit articles ');
$ user - > assignRole(' writer ');
$ user - > givePermissionTo(' delete articles ');
//在上面的例子中,角色被授予編輯文章的權(quán)限,并且該角色被分配給用戶?,F(xiàn)在,用戶可以編輯文章并刪除文章。
//“刪除文章”的權(quán)限是直接分配給用戶的直接權(quán)限。
//當(dāng)我們調(diào)用$user->hasDirectPermission('delete articles')它返回true,
//但false對(duì)$user->hasDirectPermission('edit articles')。
//如果為應(yīng)用程序中的角色和用戶設(shè)置權(quán)限并希望限制或更改用戶角色的繼承權(quán)限(即,僅允許更改用戶的直接權(quán)限),則此方法非常有用。
//您可以列出所有這些權(quán)限:
//直接權(quán)限
$ user - > getDirectPermissions() //或$ user-> permissions;

//從用戶角色繼承的權(quán)限
$ user - > getPermissionsViaRoles();

//所有適用于用戶的權(quán)限(繼承和直接)
$ user - > getAllPermissions();
//所有這些響應(yīng)都是Spatie\Permission\Models\Permission對(duì)象的集合。
//如果我們按照前面的例子,第一個(gè)響應(yīng)將是一個(gè)具有delete article權(quán)限的集合,
//第二個(gè)響應(yīng)將是一個(gè)具有權(quán)限的集合,edit article第三個(gè)將包含這兩個(gè)集合。
在哪兒做限制,在哪兒使用

首先你可以在action中檢測(cè)這個(gè)用戶有沒(méi)有這項(xiàng)權(quán)限!

你還可以在request中使用,當(dāng)用戶請(qǐng)求一個(gè)接口時(shí)、系統(tǒng)會(huì)去判斷用戶是否擁有通過(guò)這個(gè)接口的權(quán)限和角色!

這個(gè)request當(dāng)然要在接口調(diào)用方法的時(shí)候注入進(jìn)去!

下面給出位置

namespace App\Containers\Authorization\UI\API\Requests;
/**
 * Define which Roles and/or Permissions has access to this request.
 *
 * @var  array
 */
protected $access = [
    'permissions' => 'add-permission-byRole',
    'roles'       => '',
];
總結(jié):

laravel有幾個(gè)角色權(quán)限控制,但是我選擇這個(gè),laravel-permission好搜索、不是因?yàn)檎l(shuí)好誰(shuí)差的!總的來(lái)說(shuō)角色權(quán)限就角色表和權(quán)限表,然后就是用戶、角色、權(quán)限的關(guān)系維護(hù)!其實(shí)也可以不用他自帶的方法!

基本表的關(guān)系都是多對(duì)多可以使用attach和detch、sync來(lái)維護(hù)他們之間的關(guān)系!

如果自己玩得夠熟悉了,也不需要他的關(guān)系表,完全可以自己寫(xiě)好來(lái)實(shí)現(xiàn)這一成的關(guān)系!

感謝各位的閱讀!關(guān)于“l(fā)aravel-permission角色權(quán)限控制的示例”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI