在大多数的web开发中,角色和权限的管理都是非常重要的一部分。Laravel上关于角色和权限管理的包有很多,今天就为大家介绍几个好用的包。比如Entrust等,
我们为什么需要第三方包?
首先,Laravel自己本来就已经提供了一些管理权限的基本功能,这些基本的功能在5.1.11版本中就具备了,并且一直保留到现在。常见的方法如下:
Gates 和 Policies$this->authorize()方法Blade模版中的@can
和@cannot
命令
也许对于某些人来说,Laravel提供的这些基本的权限管理功能已经足够了。但是,如果你想要更简单更方便的管理权限和角色,那Laravel自带的权限管理功能就不太够用了。下面推荐两款不错的包:
Laravel-permissionBouncer
⚠️注意:Github上有这样一个包:santigarcor/laratrust,它其实是Entrust项目中fork出来的一个新的项目(应为Entrust现在已经不再维护了,只支持到Laravel 5),这个用来管理角色和权限也是很不错的。但是,Laratrust中已经把Laravel中的一些默认命令替换掉了,所以在使用的时候不能使用
Gates
和@can
语法,取而代之的是$user->can(‘edit-user’)
和@permission
语法,除了这个注意点外,Laratrust是一个很好的项目。此外,值得赞的地方就是Laratrust还具备了适用于团队开发的一些功能,而这个功能在上面两个包中是没有的。
此外,还有一些其他的包,由于项目不太活跃,还有点过时这里不太推荐,但学习一下还是可以的:
Romanbican / rolesKodeine / Laravel-acl
详细说一下最上面推荐的两个包
Laravel-permission和Bouncer提供的API让我们在对角色和权限管理时更加简单,而且在调用时代码也很容易理解。在创建规则时,Laravel-permission和Bouncer的方式和Laravel的Policies
和Gates
有所不同:
$user->givePermissionTo('edit articles'); // Laravel-permission$user->allow('ban-users'); // Bouncer
上面两个包,除了语法和数据库的结构略有不同外,其他都是差不多的。
具体的安装使用
Laravel-permission和Bouncer的安装方法很相似:
向composer.json
文件添加配置命令并安装在config/app.php
文件中添加provider 和 facade (Bouncer)
执行Publish和migrations
命令向不同的Model
中设置Trait
在做下面的操作前,先要创建一个用户表,并且不要给这个表分配角色和权限,对于新项目来说就是创建一个基础的用户表。接下来,就可以针对这两个包做一些权限控制的操作。
数据表结构
说明:
guard_name
字段的默认值是web
,Laravel-Permission是允许使用不同的guards的。正如图上看到的,在管理权限方面,Laravel-Permission是使用了两个维度,一个是针对角色,一个是针对用户。model_type
字段的默认值是App\User
,所以对于user
表来说没有直接的外键约束,应为其他表暂时还没有user_id
字段。
和Laravel-permission比,是不是明显感觉表之间的关系变简单了?️
说明:
上图中有一个叫
abilities
的表,这对应于Laravel-permission中的permissions
表,然后在Bouncer中,permissions
表就关联到abilities
中的一系列entity
.在这个包的所有表中,"Entity"
就代表了某一个操作的具体对象。它可能代表某一类角色,或是某一特定用户。所以,在上面的表结构中,我们并没有发现与user_id
和users
属性有直接关系的表,Laravel-permission中也是如此。在上面的表中,我们还可以看到一些特殊的字段,比如:abilities.title
、abilities.only_own
和roles.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!@elseI'm not a writer...@endrole
@hasanyrole('writer|admin')I have one or more of these roles!@elseI 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优点:和Bouncer相比,文档更全一点,Bouncer的README中有些方法并没有说明数据库结构更加易懂syncRoles()
方法取代了先删除再插入的方式提供了Blade命令可以使用多个guards
Bouncer优点:一行代码就能创建一个角色/行为能力并分配给用户可以针对单个模型开启或关闭权限不错的缓存机制数据库结构设计的非常健壮,添加了一些很有用的字段✨相关项目的推荐
以上两个包只是提供了管理角色和权限的功能,如果有基于这些包的管理模版那该多好呢,下面就介绍两个:
?Laravel 5.4 admin panel based on Spatie Laravel-permission
?Laravel 5.4 admin panel based on Bouncer
关于Laravel上的权限与角色的设置,以后别再说Entrust了,已经过时啦!?️?️?️
原文地址:https://laravel-/two-...