使用Entrust擴充套件包在laravel 中實現RBAC的功能
想要在Laravel中使用Entrust,首先需要通過Composer
來安裝其依賴包:
composer require zizaco/entrust 5.2.x-de
安裝完成後需要在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,
②配置
在配置檔案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
如果執行上面的 命令出現 以下的錯誤:
處理方法:vendor-> zizaco-> entrust-> src-> commands-> MigrationCommand.php ,並將”fire“方法更改為”handle“ 然後通過以下命令生成相應的資料表:
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(); // 不管透視表是否有級聯刪除都會生效
總結
到此這篇關於使用Entrust擴充套件包在laravel 中實現RBAC的功能的文章就介紹到這了,更多相關Entrust擴充套件包實現RBAC內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!