Laravel 使用 Entrust 實現 RBAC(一)

river_bird發表於2018-07-10

1、安裝
想要在Laravel中使用Entrust,首先需要通過Composer來安裝其依賴包:
composer require zizaco/entrust 5.2.x-dev
安裝完成後需要在config/app.php中註冊服務提供者到providers陣列:
Zizaco\Entrust\EntrustServiceProvider::class,
同時在該配置檔案中註冊相應門面到aliases陣列:
'Entrust' => Zizaco\Entrust\EntrustFacade::class,
如果你想要使用中介軟體(要求Laravel 5.1或更高版本)還需要新增如下程式碼到app/Http/Kernel.php的routeMiddleware陣列:

'role' => \Zizaco\Entrust\Middleware\EntrustRole::class,
'permission' => \Zizaco\Entrust\Middleware\EntrustPermission::class,
'ability' => \Zizaco\Entrust\Middleware\EntrustAbility::class,

2、配置
在配置檔案config/auth.php中設定合適的值,Entrust會使用這些配置值來選擇相應的使用者表和模型類:

'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => App\User::class,
        'table' => 'users',
    ],
],

你還可以釋出該擴充套件包的配置以便後續自定義相關表名以及模型類的名稱空間:


php artisan vendor:publish

該命令會在config目錄下建立一個entrust.php檔案。

3、使用者角色許可權表
接下來我們使用Entrust提供的遷移命令生成遷移檔案:

php artisan entrust:migration
然後通過以下命令生成相應的資料表:

php artisan migrate
最終會生成4張新表:

  • roles —— 儲存角色
  • permissions —— 儲存許可權
  • role_user —— 儲存角色與使用者之間的多對多關係
  • permission_role —— 儲存角色與許可權之間的多對多關係
    4、模型類
    Role
    我們需要建立Role模型類app/Role.php並編輯其內容如下:
<?php namespace App;

use Zizaco\Entrust\EntrustRole;

class Role extends EntrustRole
{
}

Role模型擁有三個主要屬性:

  • name —— 角色的唯一名稱,如“admin”,“owner”,“employee”等
  • display_name —— 人類可讀的角色名,例如“後臺管理員”、“作者”、“僱主”等
  • description —— 該角色的詳細描述
  • display_name和description屬性都是可選的,在資料庫中的相應欄位預設為空。

Permission
接下來建立Permission模型app/Permission.php並編輯其內容如下:

<?php namespace App;

use Zizaco\Entrust\EntrustPermission;

class Permission extends EntrustPermission
{
}

Permission模型也有三個主要屬性:

  • name —— 許可權的唯一名稱,如“create-post”,“edit-post”等
  • display_name —— 人類可讀的許可權名稱,如“釋出文章”,“編輯文章”等
  • description —— 該許可權的詳細描述
    User
    接下來我們在User模型中使用EntrustUserTrait:
<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Zizaco\Entrust\Traits\EntrustUserTrait;

class User extends Authenticatable
{
    use Notifiable;
    use EntrustUserTrait;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];
}

這將會建立User與Role之間的關聯關係:在User模型中新增roles()、hasRole($name)、can($permission)以及ability($roles,$permissions,$options)方法。

軟刪除
使用Entrust提供的遷移命令生成的關聯關係表中預設使用了onDelete('cascade')以便父級記錄被刪除後移除其對應的關聯關係。如果你由於某種原因不能在資料庫中使用級聯刪除,那麼可以在EntrustRole、EntrustPermission類以及HasRole trait提供的事件監聽器中手動刪除關聯表中的記錄。如果模型使用了軟刪除,那麼當不小心誤刪除資料時,事件監聽器將不會刪除關聯表資料。不過,由於Laravel事件監聽器的侷限性,所以暫時無法區分是呼叫delete()還是forceDelete(),基於這個原因,在你刪除一個模型之前,必須手動刪除所有關聯資料(除非你的資料表使用了級聯刪除):

$role = Role::findOrFail(1); // 獲取給定許可權

// 正常刪除
$role->delete();

// 強制刪除
$role->users()->sync([]); // 刪除關聯資料
$role->perms()->sync([]); // 刪除關聯資料

$role->forceDelete(); // 不管透視表是否有級聯刪除都會生效
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章