laravel-permission使用手册

小贴士

1. laravel和laravel-permission的版本需要匹配,过高的laravel-permission版本可能不适用于低版本laravel

2. laravel-permission会在项目config文件夹下创建名为permission.php的配置文件,如果config文件夹下本来就存在同名文件需要移除或重命名旧文件

3.使用该扩展包的模型中不能存在名为permissions和roles字段,否则会使得其产生冲突并导致功能失效甚至报错


安装

1. 安装包文件

composer require spatie/laravel-permission

2. 在config/app.php文件的providers中添加

'providers' => [

    // ...    

    Spatie\Permission\PermissionServiceProvider::class,

];

3. 发布迁移文件,并在config文件夹下生成permission.php

php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"

tips: 如果config文件夹下本来就存在permission.php文件需要移除或重命名该文件

4. 如果在本地缓存配置,需要用以下命令清除缓存:

php artisan optimize:clear 

# or 

php artisan config:clear

5. 执行迁移文件,生成数据表

php artisan migrate



使用

将名为Spatie\Permission\Traits\HasRoles的trait加入到需要使用权限的模型

use Illuminate\Foundation\Auth\User as Authenticatable;

use Spatie\Permission\Traits\HasRoles;

class User extends Authenticatable {

    use HasRoles;

    // ...

}

1. 新增角色/权限

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

$permission = Permission::create(['name' => 'edit articles']);

2. 权限--角色

// 单权限

$role->givePermissionTo($permission);

$permission->assignRole($role);

// 多个权限

$role->syncPermissions($permissions);

$permission->syncRoles($roles);

// 取消权限授予角色

$role->revokePermissionTo($permission);

$permission->removeRole($role);

3. 其他相关查询

// get a list of all permissions directly assigned to the user

$permissionNames = $user->getPermissionNames(); // collection of name strings

$permissions = $user->permissions; // collection of permission objects

// get all permissions for the user,either directly, or from roles, or from both

$permissions = $user->getDirectPermissions();

$permissions = $user->getPermissionsViaRoles();

$permissions = $user->getAllPermissions();

// get the names of the user's roles

$roles = $user->getRoleNames(); // Returns a collection

4. 使用HasRoles trait的模型,被赋予了名为role和permission的scope方法

$users = User::role('writer')->get();  // Returns only users with the role 'writer'

$users = User::permission('edit articles')->get(); // Returns only users with the permission 'edit articles' (inherited or directly)

5.由于Role和Permission模型继承了Eloquent,可以Eloquent相关方法属性

$all_users_with_all_their_roles = User::with('roles')->get();

$all_users_with_all_direct_permissions = User::with('permissions')->get();

$all_roles_in_database = Role::all()->pluck('name');

$users_without_any_roles = User::doesntHave('roles')->get();

$all_roles_except_a_and_b = Role::whereNotIn('name', ['role A','role B'])->get();

6. 权限--用户

// 赋予权限

$user->givePermissionTo('edit articles'); 

$user->givePermissionTo('edit articles', 'delete articles'); 

$user->givePermissionTo(['edit articles', 'delete articles']);

// 收回权限

$user->revokePermissionTo('edit articles');

// 检测是否具有权限

$user->hasPermissionTo('edit articles');

$user->can('edit articles'); // laravel 默认方法

// 是否具有其中任意权限

$user->hasAnyPermission(['edit articles', 'publish articles', 'unpublish articles']);

// 是否拥有全部权限

$user->hasAllPermissions(['edit articles', 'publish articles', 'unpublish articles']);

$user->hasDirectPermission('edit articles'); 

$user->hasAllDirectPermissions(['edit articles', 'delete articles']); 

 $user->hasAnyDirectPermission(['create articles', 'delete articles']);

// 返回通过赋予权限获取的权限

$user->getDirectPermissions();  // Or  $user->permissions; 

 // 仅返回通过角色获取的权限

$user->getPermissionsViaRoles(); 

 // 所有权限(直接赋予或角色赋予)

 $user->getAllPermissions();

7. 角色--用户

// 授予单个角色

$user->assignRole('writer');

// 授予多个角色

$user->assignRole('writer', 'admin');

$user->assignRole(['writer', 'admin']);

// 收回授予角色

$user->removeRole('writer');

// All current roles will be removed from the user and replaced by the array given

// 收回当前角色并授予新角色

$user->syncRoles(['writer', 'admin']);

// 是否具有指定角色

$user->hasRole('writer');

// 是否具有至少其中一个角色

$user->hasRole(['editor', 'moderator']);

$user->hasAnyRole(['writer', 'reader']);

$user->hasAnyRole('writer', 'reader');

// 是否具有所有角色

$user->hasAllRoles(Role::all());

8. 角色--权限

$role->givePermissionTo('edit articles');

$role->hasPermissionTo('edit articles');

$role->revokePermissionTo('edit articles');

中间件 Middleware

1. 注册

要想使用该中间件,首先需要在app/Http/Kernel.php文件中注册

protected $routeMiddleware = [

    // ...   

    'role' => \Spatie\Permission\Middlewares\RoleMiddleware::class,

    'permission' => \Spatie\Permission\Middlewares\PermissionMiddleware::class,

    'role_or_permission' =>     \Spatie\Permission\Middlewares\RoleOrPermissionMiddleware::class,

];

2. 使用

1) 路由中

Route::group(['middleware' => ['role:super-admin']], function(){

    //

});

Route::group(['middleware' => ['permission:publish articles']], function(){

    //

});

Route::group(['middleware' => ['role:super-admin','permission:publish articles']], function(){

    //

});

Route::group(['middleware' => ['role_or_permission:super-admin|edit articles']], function(){

    //

});

Route::group(['middleware' => ['role_or_permission:publish articles']], function(){

    //

});

// 多个权限采用管道(pipe |)特性

Route::group(['middleware' => ['role:super-admin|writer']], function(){

    //

});

Route::group(['middleware' => ['permission:publish articles|edit articles']], function(){

    //

});

Route::group(['middleware' => ['role_or_permission:super-admin|edit articles']], function(){

    //

});

2) 构造函数中

publicfunction__construct()

{

    $this->middleware(['role:super-admin','permission:publish articles|edit articles']);

}

publicfunction__construct()

{

    $this->middleware(['role_or_permission:super-admin|edit articles']);

}



artisan Commands

通过artisan 命令操作权限和角色

php artisan permission:create-role writer

php artisan permission:create-permission "edit articles"

// 带有guard name的新建

php artisan permission:create-role writer web

// 创建角色并赋予权限

php artisan permission:create-role writer web "create articles|edit articles"

// 按照guard name分别展示其角色和权限表

php artisan permission:show

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容