1檀蹋、安裝
想要在Laravel中使用Entrust,首先需要通過Composer來安裝其依賴包:
composer require zizaco/entrust 5.2.x-dev
安裝完成后需要在config/app.php中注冊服務(wù)提供者到providers數(shù)組:
Zizaco\Entrust\EntrustServiceProvider::class,
同時(shí)在該配置文件中注冊相應(yīng)門面到aliases數(shù)組:
'Entrust' => Zizaco\Entrust\EntrustFacade::class,
如果你想要使用中間件(要求Laravel 5.1或更高版本)還需要添加如下代碼到app/Http/Kernel.php的routeMiddleware數(shù)組:
'role' => \Zizaco\Entrust\Middleware\EntrustRole::class,
'permission' => \Zizaco\Entrust\Middleware\EntrustPermission::class,
'ability' => \Zizaco\Entrust\Middleware\EntrustAbility::class,
2咖为、配置
在配置文件config/auth.php中設(shè)置合適的值,Entrust會(huì)使用這些配置值來選擇相應(yīng)的用戶表和模型類。
你還可以發(fā)布該擴(kuò)展包的配置以便后續(xù)自定義相關(guān)表名以及模型類的命名空間:
php artisan vendor:publish
該命令會(huì)在config目錄下創(chuàng)建一個(gè)entrust.php文件靠柑。
3、用戶角色權(quán)限表
接下來我們使用Entrust提供的遷移命令生成遷移文件:
php artisan entrust:migration
然后通過以下命令生成相應(yīng)的數(shù)據(jù)表:
php artisan migrate
最終會(huì)生成4張新表:
roles—— 存儲(chǔ)角色
permissions—— 存儲(chǔ)權(quán)限
role_user—— 存儲(chǔ)角色與用戶之間的多對多關(guān)系
permission_role—— 存儲(chǔ)角色與權(quán)限之間的多對多關(guān)系
4吓懈、模型類
Role
我們需要?jiǎng)?chuàng)建Role模型類app/Models/Role.php并編輯其內(nèi)容如下:
use Zizaco\Entrust\EntrustRole;
class Role extends EntrustRole{}
Role模型擁有三個(gè)主要屬性:
name—— 角色的唯一名稱歼冰,如“admin”,“owner”耻警,“employee”等
display_name—— 人類可讀的角色名隔嫡,例如“后臺(tái)管理員”、“作者”甘穿、“雇主”等
description—— 該角色的詳細(xì)描述
display_name和description屬性都是可選的腮恩,在數(shù)據(jù)庫中的相應(yīng)字段默認(rèn)為空。
Permission
接下來創(chuàng)建Permission模型app/models/Permission.php并編輯其內(nèi)容如下:
use Zizaco\Entrust\EntrustPermission;
class Permission extends EntrustPermission{}
Permission模型也有三個(gè)主要屬性:
name—— 權(quán)限的唯一名稱温兼,如“create-post”秸滴,“edit-post”等
display_name—— 人類可讀的權(quán)限名稱,如“發(fā)布文章”募判,“編輯文章”等
description—— 該權(quán)限的詳細(xì)描述
User
接下來我們在User模型中使用EntrustUserTrait:
use Zizaco\Entrust\Traits\EntrustUserTrait;
class User extends Eloquent{
use EntrustUserTrait; // add this trait to your user model
...
}
這將會(huì)建立User與Role之間的關(guān)聯(lián)關(guān)系:在User模型中添加roles()荡含、hasRole($name)、can($permission)以及ability($roles,$permissions,$options)方法届垫。
軟刪除
使用Entrust提供的遷移命令生成的關(guān)聯(lián)關(guān)系表中默認(rèn)使用了onDelete('cascade')以便父級記錄被刪除后會(huì)移除其對應(yīng)的關(guān)聯(lián)關(guān)系释液。如果你由于某種原因不能在數(shù)據(jù)庫中使用級聯(lián)刪除,那么可以EntrustRole装处、EntrustPermission類以及HasRole trait提供的事件監(jiān)聽器手動(dòng)刪除關(guān)聯(lián)表中的記錄误债。如果模型使用了軟刪除,那么當(dāng)不小心誤刪除數(shù)據(jù)時(shí)符衔,事件監(jiān)聽器將不會(huì)刪除關(guān)聯(lián)表數(shù)據(jù)找前。然而糟袁,由于Laravel事件監(jiān)聽器的局限性判族,所以暫時(shí)無法區(qū)分是調(diào)用delete()還是forceDelete(),基于這個(gè)原因项戴,在你刪除一個(gè)模型之前形帮,必須手動(dòng)刪除所有關(guān)聯(lián)數(shù)據(jù)(除非你的數(shù)據(jù)表使用了級聯(lián)刪除):
$role = Role::findOrFail(1); // Pull back a given role
// Regular Delete
$role->delete(); // This will work no matter what
// Force Delete
$role->users()->sync([]); // Delete relationship data
$role->perms()->sync([]); // Delete relationship data
$role->forceDelete(); // Now force delete will work regardless of whether the pivot table has cascading delete
1、創(chuàng)建角色/權(quán)限并進(jìn)行分配
首先我們來創(chuàng)建Role和Permission:
$owner = new Role();
$owner->name = 'owner';
$owner->display_name = 'Project Owner';
$owner->description = 'User is the owner of a given project';
$owner->save();
$admin = new Role();
$admin->name = 'admin';
$admin->display_name = 'User Administrator';
$admin->description = 'User is allowed to manage and edit other users';
$admin->save();
接下來我們將創(chuàng)建的兩個(gè)roles分配給用戶:
$user = User::where('username', '=', 'michele')->first();
//調(diào)用hasRole提供的attachRole方法
$user->attachRole($admin); // 參數(shù)可以是Role對象周叮,數(shù)組或id
// 或者也可以使用Eloquent原生的方法
$user->roles()->attach($admin->id); //只需傳遞id即可
現(xiàn)在我們還需要添加相應(yīng)權(quán)限到這些角色上:
$createPost = new Permission();
$createPost->name = 'create-post';
$createPost->display_name = 'Create Posts';
$createPost->description = 'create new blog posts';
$createPost->save();
$editUser = new Permission();
$editUser->name = 'edit-user';
$editUser->display_name = 'Edit Users';
$editUser->description = 'edit existing users';
$editUser->save();
$admin->attachPermission($createPost);
//等價(jià)于 $admin->perms()->sync(array($createPost->id));
$owner->attachPermissions(array($createPost, $editUser));
//等價(jià)于 $owner->perms()->sync(array($createPost->id, $editUser->id));
2辩撑、檢查角色&權(quán)限
完成上述操作后,下面我們可以檢查相應(yīng)角色和權(quán)限:
$user->hasRole('owner'); // false
$user->hasRole('admin'); // true
$user->can('edit-user'); // false
$user->can('create-post'); // true
hasRole()和can都可以接收數(shù)組形式的角色和權(quán)限進(jìn)行檢查:
$user->hasRole(['owner', 'admin']); // true
$user->can(['edit-user', 'create-post']); // true
默認(rèn)情況下仿耽,如果用戶擁有以上任意一個(gè)角色或權(quán)限都會(huì)返回true合冀,如果你想檢查用戶是否擁有所有角色及權(quán)限,可以傳遞true作為第二個(gè)參數(shù)到相應(yīng)方法:
$user->hasRole(['owner', 'admin']); // true
$user->hasRole(['owner', 'admin'], true); // false
$user->can(['edit-user', 'create-post']); // true
$user->can(['edit-user', 'create-post'], true); // false
用戶可以擁有多個(gè)角色项贺。
除此之外君躺,還可以通過Entrust門面檢查當(dāng)前登錄用戶是否擁有指定角色和權(quán)限:
Entrust::hasRole('role-name');
Entrust::can('permission-name');
甚至還可以通過通配符的方式來檢查用戶權(quán)限:
// match any admin permission
$user->can("admin.*"); // true
// match any permission about users
$user->can("*_users"); // true