【 Laravel 工具包推薦--角色/權限管理】

Laravel 角色與權限管理

在大多數的web開發中,角色和權限的管理都是很是重要的一部分。Laravel上關於角色和權限管理的包有不少,今天就爲你們介紹幾個好用的包。好比Entrust等,php

咱們爲何須要第三方包?

首先,Laravel本身原本就已經提供了一些管理權限的基本功能,這些基本的功能在5.1.11版本中就具有了,而且一直保留到如今。常見的方法以下:laravel

也許對於某些人來講,Laravel提供的這些基本的權限管理功能已經足夠了。可是,若是你想要更簡單更方便的管理權限和角色,那Laravel自帶的權限管理功能就不太夠用了。下面推薦兩款不錯的包:git

⚠️注意:Github上有這樣一個包:santigarcor/laratrust,它實際上是Entrust項目中fork出來的一個新的項目(應爲Entrust如今已經再也不維護了,只支持到Laravel 5),這個用來管理角色和權限也是很不錯的。可是,Laratrust中已經把Laravel中的一些默認命令替換掉了,因此在使用的時候不能使用Gates@can語法,取而代之的是$user->can(‘edit-user’)@permission語法,除了這個注意點外,Laratrust是一個很好的項目。此外,值得讚的地方就是Laratrust還具有了適用於團隊開發的一些功能,而這個功能在上面兩個包中是沒有的。github

此外,還有一些其餘的包,因爲項目不太活躍,還有點過期這裏不太推薦,但學習一下仍是能夠的:web

詳細說一下最上面推薦的兩個包

Laravel-permission和Bouncer提供的API讓咱們在對角色和權限管理時更加簡單,並且在調用時代碼也很容易理解。在建立規則時,Laravel-permission和Bouncer的方式和Laravel的PoliciesGates有所不一樣:數據庫

$user->givePermissionTo('edit articles'); // Laravel-permission
$user->allow('ban-users'); // Bouncer

上面兩個包,除了語法和數據庫的結構略有不一樣外,其餘都是差很少的。json

具體的安裝使用

Laravel-permission和Bouncer的安裝方法很類似:數組

  • composer.json文件添加配置命令並安裝
  • config/app.php文件中添加provider 和 facade (Bouncer)
  • 執行Publish和migrations命令
  • 向不一樣的Model中設置Trait

在作下面的操做前,先要建立一個用戶表,而且不要給這個表分配角色和權限,對於新項目來講就是建立一個基礎的用戶表。接下來,就能夠針對這兩個包作一些權限控制的操做。緩存

數據表結構

Laravel-permission的數據庫表結構

說明:app

  • guard_name字段的默認值是web,Laravel-Permission是容許使用不一樣的guards的。
  • 正如圖上看到的,在管理權限方面,Laravel-Permission是使用了兩個維度,一個是針對角色,一個是針對用戶。
  • model_type字段的默認值是App\User,因此對於user表來講沒有直接的外鍵約束,應爲其餘表暫時尚未user_id字段。

Bouncer的數據庫表結構

和Laravel-permission比,是否是明顯感受表之間的關係變簡單了?️

說明:

  • 上圖中有一個叫abilities的表,這對應於Laravel-permission中的permissions表,而後在Bouncer中,permissions表就關聯到abilities中的一系列entity.
  • 在這個包的全部表中,"Entity"就表明了某一個操做的具體對象。它可能表明某一類角色,或是某一特定用戶。因此,在上面的表結構中,咱們並無發現與user_idusers屬性有直接關係的表,Laravel-permission中也是如此。
  • 在上面的表中,咱們還能夠看到一些特殊的字段,好比:abilities.titleabilities.only_ownroles.level,這幾個字段在之後的使用中會很是有用。
  • 在Bouncer中,並無具體的guard字段。

從Bouncer的表結構中能夠看出,這個設計思路有點特別,雖然就4個表,可是比上面那個要複雜點,對新手來講會難以理解。也正由於它的特別,在使用的時候會很靈活。

可以使用的方法函數

兩個包在使用上大同小異,來對比下:

建立角色/權限/行爲能力
  • Laravel-permission

在Laravel中你可使用Facades模式:

use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;

Role::create(['name' => 'writer']);

Permission::create(['name' => 'edit articles']);
  • Bouncer

能夠用一行代碼就能建立一個具備某種行爲能力的角色:

Bouncer::allow('admin')->to('ban-users');

執行?上面這行,Bouncer就會分別在roles表和abilities表中建立兩個記錄。若是你習慣於Facades的方式的話,也能夠用這樣的方法:

use Silber\Bouncer\Database\Ability;
Ability::create(['name' => 'edit articles']);

給用戶分配角色
  • Laravel-permission
$user->assignRole('writer');
$user->assignRole(['writer', 'admin']);

$user->removeRole('writer');

角色同步:

// 用戶全部分配的角色都會被下面的角色數組替換
$user->syncRoles(['writer', 'admin']);
  • Bouncer
$user->assign('admin');
$user->assign(['writer', 'admin']);

$user->retract('admin');

能夠看到,兩個包都支持用一個變量或一個數組來分配角色,但由於Laravel-permission有一個角色同步的功能,因此會跟強大一些,而Bouncer在操做角色同步時會須要一些額外的操做。


給用戶分配權限/行爲能力
  • Laravel-permission
// 分配
$user->givePermissionTo('edit articles');
$user->givePermissionTo('edit articles', 'delete articles');
// 撤銷
$user->revokePermissionTo('edit articles');
  • Bouncer
$user->allow('ban-users');
$user->allow(['ban-users', 'edit-articles']);

在分配權限時,還能夠指定模型,只須要把模型的實例對象或類名做爲第二個參數:

Bouncer::allow($user)->to('edit', Post::class);
Bouncer::allow($user)->to('edit', $post);

$user->disallow('ban-users');
Bouncer::disallow($user)->to('delete', Post::class);

檢查用戶的權限/角色
  • Laravel-permission

檢查角色:

$user->hasRole('writer');
$user->hasAnyRole(Role::all());
$user->hasAllRoles(Role::all());

檢查權限:

$user->can('edit articles');
$role->hasPermissionTo('edit articles');
  • Bouncer

檢查角色:

$user->isAn('admin');
$user->isA('subscriber', 'editor');
$user->isAll('editor', 'moderator');
$user->isNot('subscriber', 'moderator');

檢查權限:

Bouncer::allows('edit articles')

Blade 模版命令
  • Laravel-permission
@role('writer')
    I'm a writer!
@else
    I'm not a writer...
@endrole
@hasanyrole('writer|admin')
    I have one or more of these roles!
@else
    I have none of these roles...
@endhasanyrole
  • Bouncer

Bouncer並無提供特定的Blade命令。固然,不管是哪一個包,均可以在Blade中使用@can@endcan命令。


緩存
  • Laravel-permission

在Laravel-permission中,爲了提升應用的性能,或自動的存儲角色和權限數據。清除緩存可使用下面的命令:

php artisan cache:forget spatie.permission.cache
  • Bouncer

Bouncer會緩存當前請求的全部查詢數據,若是開啓了cross-request緩存,就會跨請求緩存。

刷新緩存:

Bouncer::refresh();

固然也能夠只刷新指定用戶的緩存:

Bouncer::refreshFor($user);

總結

  • Laravel-permission優勢:
  1. 和Bouncer相比,文檔更全一點,Bouncer的README中有些方法並無說明
  2. 數據庫結構更加易懂
  3. syncRoles()方法取代了先刪除再插入的方式
  4. 提供了Blade命令
  5. 可使用多個guards
  • Bouncer優勢:
  1. 一行代碼就能建立一個角色/行爲能力並分配給用戶
  2. 能夠針對單個模型開啓或關閉權限
  3. 不錯的緩存機制
  4. 數據庫結構設計的很是健壯,添加了一些頗有用的字段

✨相關項目的推薦

以上兩個包只是提供了管理角色和權限的功能,若是有基於這些包的管理模版那該多好呢,下面就介紹兩個:

基於Bouncer的後臺模版

關於Laravel上的權限與角色的設置,之後別再說Entrust了,已通過時啦!?️?️?️

原文地址:https://laravel-news.com/two-...

相關文章
相關標籤/搜索