【 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-...

相关文章
相关标签/搜索