当前位置: 首页 > 后端技术 > PHP

【Laravel工具包推荐--角色-权限管理】

时间:2023-03-29 15:05:37 PHP

在大多数web开发中,角色和权限的管理是非常重要的一环。Laravel上有很多用于角色和权限管理的包。今天就给大家介绍几个好用的包。比如Entrust等,为什么需要第三方包?首先,Laravel本身已经提供了一些基本的权限管理功能。这些基本功能在5.1.11版本中都有,并一直保留至今。常用方法如下:Gates和Policies$this->authorize()方法Blade模板中的@can和@cannot命令或许对于一些人来说,Laravel提供的这些基本的权限管理功能就足够了。但是,如果你想要更简单方便的管理权限和角色,那么Laravel内置的权限管理功能是不够的。下面推荐两个不错的包:Laravel-permissionBouncer??注:Github上有这样一个包:santigarcor/laratrust,其实是从Entrust项目中fork出来的一个新项目(应该是Entrust不再维护了,只支持到Laravel5),这对于管理角色和权限也非常有用。但是Laravel中的一些默认命令在Laratrust中已经被替换,所以使用时不能使用Gates和@can语法,取而代之的是$user->can('edit-user')和@permission语法,除了这个注释之外,Laratrust是一个非常好的项目。另外,值得表扬的是,Laratrust还有一些适合团队开发的功能,是以上两个包所没有的。此外,还有一些其他的包。因为项目不是很活跃,有点过时了。这里不推荐,不过还是可以学习的:Romanbican/rolesKodeine/Laravel-acl先说一下最推荐的两个包Laravel-permissionBouncer提供的API,方便我们管理角色和权限,以及代码在调用时很容易理解。在创建规则时,Laravel-permission和Bouncer不同于Laravel的Policies和Gates:$user->givePermissionTo('editarticles');//Laravel权限$user->allow('ban-users');//上面两个Bouncer的包除了语法和数据库结构略有不同外,其他的都差不多。使用Laravel-permission和Bouncer的具体安装方法非常相似:在composer.json文件中添加配置命令,在config/app.php文件中安装。添加provider和facade(Bouncer),对不同的Model执行Publish和migrations命令在设置Trait做以下操作之前,先创建一张user表,不要给这张表分配角色和权限。对于新项目,创建一个基本用户表。接下来就可以对这两个包做一些权限控制操作了。数据表结构说明:guard_name字段默认值为web,Laravel-Permission允许使用不同的守卫。如图所示,在管理权限方面,Laravel-Permission使用了两个维度,一个是角色,一个是用户。model_type字段的默认值为App\User,所以user表没有直接的外键约束,因为其他表还没有user_id字段。和Laravel-permission相比,是不是明显感觉到表之间的关系变简单了??说明:上图中有一个表叫做abilities,对应Laravel-permission中的权限表,然后在Bouncer中,权限表是关联abilities中的一系列实体。在这个包的所有表中,“Entity”代表了某个操作的具体对象。它可能代表一类角色或特定用户。因此,在上面的表结构中,我们并没有找到与user_id和users属性直接相关的表,在Laravel-permission中也是如此。在上表中,我们还可以看到一些特殊的字段,比如:abilities.title、abilities.only_own和roles.level,这些字段在以后的使用中会非常有用。在Bouncer中,没有特定的守卫场。从Bouncer的表结构可以看出,这种设计思路有点特别。虽然只有4张表,但是比上面的要复杂一些,新手理解起来会比较吃力。也因为它的特殊性,在使用上会非常灵活。两个包可用的方法和功能在使用上都差不多,比较一下:创建角色/权限/行为能力使用Spatie\Permission\Models\Permission;Role::create(['name'=>'writer']);Permission::create(['name'=>'editarticles']);Bouncer可以创建一个具有一定行为能力的A角色:Bouncer::allow('admin')->to('ban-users');执行上面这行,Bouncer会分别在roles表和abilities表中创建两条记录。如果你用惯了Facades,也可以使用这个方法:useSilber\Bouncer\Database\Ability;Ability::create(['name'=>'editarticles']);为用户分配角色角色同步://所有分配给用户的角色都会被下面的角色数组替换$user->syncRoles(['writer','admin']);Bouncer$user->assign('admin');$user->assign(['writer','admin']);$user->retract('admin');可以看到,这两个包都支持使用变量或者数组来分配角色,但是因为Laravel-permission有角色同步的功能,所以会更加强大。但是Bouncer在操作角色同步的时候会需要一些额外的操作。为用户分配权限/行为能力Laravel-permission//分配$user->givePermissionTo('editarticles');$user->givePermissionTo('editarticles','deletearticles');//撤销$user->revokePermissionTo('编辑文章');Bouncer$user->allow('ban-users');$user->allow(['ban-users','edit-articles']);分配权限时,也可以指定Model,只需要将模型的实例对象或类名作为第二个参数即可:Bouncer::allow($user)->to('edit',Post::class);Bouncer::allow($user)->to('edit',$post);$user->disallow('ban-users');Bouncer::disallow($user)->to('delete',Post::班级);检查用户权限/角色Laravel-权限检查角色:$user->hasRole('writer');$user->hasAnyRole(Role::all());$user->hasAllRoles(Role::all());检查权限:$user->can('editarticles');$role->hasPermissionTo('editarticles');保镖检查角色:$user->isAn('admin');$user->isA('subscriber','editor'');$user->isAll('editor','moderator');$user->isNot('订阅者','版主');检查权限:Bouncer::allows('editarticles')Blade模板命令Laravel-permission@role('writer')我是作家!@else我不是作家...@endrole@hasanyrole('writer|admin')我有一个或多个这些角色!@else我没有这些角色...@endhasanyroleBouncerBouncer不提供特定的Blade命令当然,@can和@endcan命令可以在Blade中使用,与包无关。缓存Laravel-permission在Laravel-permission中,为了提高应用性能,或者自动存储角色和权限数据。清除缓存可以使用如下命令:phpartisancache:forgetspatie.permission.cacheBouncerBouncer会缓存当前请求的所有查询数据。如果启用了跨请求缓存,则会跨请求缓存。刷新缓存:Bouncer::refresh();当然也可以只刷新指定用户的缓存:Bouncer::refreshFor($user);总结一下Laravel-permission的优点:相对于Bouncer,文档更完整,在Bouncer的README中有一些方法没有说明数据库结构,更容易理解syncRoles()方法替代了先删除再插入的方法提供可以使用多个guardsBouncer的Blade命令优点:单行代码可以创建一个角色/行为能力并分配给一个用户可以针对单个模型启用或禁用权限良好的缓存机制数据库结构设计非常健壮,一些增加了有用的字段多好啊,这里介绍两个:?Laravel5.4adminpanelbasedonSpatieLaravel-permission?Laravel5.4adminpanelbasedonBouncer关于Laravel上权限和角色的设置,不说了寄托于未来,已经落伍了!??????原文地址:https://laravel-news.com/two-...