如何在Laravel项目中拆分角色:RBAC软件包概述

在开发有用户帐户的Web项目时,经常会出现这样一个问题:组织一个角色和权限系统,以限制对系统某些部分和功能的访问。 在本文中,我们将比较访问控制包并汇总表。




引言


在版本5.1中,Laravel引入了Auth Gates,这是用于访问控制的内置框架功能。 在此之前,我不得不使用各种第三方软件包。 但是,即使是现在,程序员也可以选择:自己编写所有内容或使用一些现成的程序包。 第一种选择非常适合小型项目或具有简单权限和角色系统的项目。 第二个(具有正确的包装选择)可以进行更精细的调整。

本文的目的是回顾实现RBAC(基于角色的访问控制)-基于角色的访问控制的现有程序包。 我们将立即澄清,本文并不声称这是最终真理:每个开发人员自己必须确定他需要哪个软件包(如果有的话)。 注意:在本文中,我们正在考虑RBAC,因此,在Sentinel审查中,我们仅处理部分可用功能。

包装说明


Spatie的Laravel许可


链接: https //github.com/spatie/laravel-permission
文档: https //docs.spatie.be/laravel-permission/v3
下载次数(撰写本文时): 360万
Laravel版本:从5.8到版本3
接口的存在:否(可以使用package
基于Laravel Auth:

特色功能
  1. 用于创建/分配权限的工匠命令的可用性。
  2. 按角色和权利完成范围。
  3. 由于软件包使用Laravel Auth Gates,因此可以使用标准工具验证用户权限。
  4. 使用软件包的刀片指令的能力: 角色 (@hasrole),@ hasanyrole,@ hasallroles,@ unlessrole。
  5. 权利和角色的同步。

注意:当对策略调用authorize()时,如果权限与policy具有相同的名称,则它将起作用,而不是policy。

数据库结构



代码示例

//    $user->givePermissionTo('edit articles'); //    $user->assignRole('writer', 'admin'); //       $user->assignRole(['writer', 'admin']); //    $role->givePermissionTo('edit articles'); 


约瑟夫·西尔伯的保镖


链接: https //github.com/JosephSilber/bouncer
文档: https : //github.com/JosephSilber/bouncer#introduction
下载次数(撰写本文时): 418K
Laravel版本:从5.1.20
接口的存在:否(可以使用package
基于Laravel Auth:

特色功能
  1. 无需Laravel即可使用。
  2. 权利和角色的同步。
  3. 对权利施加限制的能力(针对特定类型的模型或特定实例)。
  4. 颁发“其”实体的所有权利:使用“ toOwn”功能,您可以授予属于用户的实体的所有权利(可以自定义user_id和$ user-> id字段的比较)。 您可以使用“至”功能限制授予的权限。
  5. 多租户支持(基于范围功能)。
  6. 使用“作用域”功能可以根据既定条件(基于唯一标识符)分隔角色和权限-例如,管理面板中的权限和网站的公共部分。
  7. 控制台artisan命令从未使用的权限中清除数据库。
  8. 快速禁止用户或删除禁令的能力(禁止的能力)。

注意:您只需一行即可创建角色和权限。

数据库结构



代码示例

通过模型类或实例对权限的限制:
 Bouncer::allow($user)->to('edit', Post::class); Bouncer::allow($user)->to('edit', $post); 


“其”实体的权利发行:
 Bouncer::allow($user)->toOwn(Post::class)->to(['view', 'update']); 


Saragarcor的Laratrust


链接: https //github.com/santigarcor/laratrust
文档: https : //laratrust.santigarcor.me/
下载次数(在撰写本文时): 601K
Laravel版本:〜6.0
接口是否可用:
基于Laravel Auth:

特色功能
  1. 这是ENTRUST( https://github.com/Zizaco/entrust )的分支
  2. 有刀片指令。
  3. 由于用它们自己的标准Laravel命令替换了,因此无法使用Blade指令can-您将不得不使用$ user-> can('edit-user')或权限指令。
  4. 角色/权限同步。
  5. 可用性功能-同时验证角色和权限。
  6. 准备好的中间件。
  7. 基于团队的多租户。


数据库结构



代码示例
    $user->hasRole(['owner', 'admin']); $user->can(['edit-user', 'create-post']); $user->hasRole('owner|admin'); $user->can('edit-user|create-post');   $user->owns($post) //   $post->user_id   $owner = new Role(); $owner->name = 'owner'; $owner->display_name = 'Project Owner'; // optional $owner->description = 'User is the owner of a given project'; // optional $owner->save(); 


Cartalyst的前哨


链接: https //github.com/cartalyst/sentinel
文档: https : //cartalyst.com/manual/sentinel/3.x
下载次数(在撰写本文时): 957K
Laravel版本: 6.2
接口是否可用:
基于Laravel Auth:

特色功能
  1. 它不仅包括角色和权利,还包括与注册有关的所有内容。
  2. 该软件包是不可知的框架,即 它不仅可以在Laravel中使用-您只需要使用composer安装以下依赖项:光照/数据库,光照/事件,symfony / http-foundation。
  3. 使用Sentinel Expired-Permissions插件,您可以发布时间权限。
  4. 通过Sentinel Multitenancy附加组件支持Mu​​ltitenancy。

注意:在纯Laravel 6.2和PostgreSQL上安装时,在迁移过程中会出现错误:users表已经存在。 在这种情况下,您必须更改标准迁移:



数据库结构



代码示例

 //   $user = Sentinel::findById(1); $role = Sentinel::findRoleByName('Subscribers'); $role->users()->attach($user); //   $admin = Sentinel::inRole('admin'); //   $user->permissions = [ 'user.create' => true, 'user.delete' => false, ]; $user->save(); //   $user->hasAccess(['user.create', 'user.update']); Sentinel::hasAnyAccess(['user.admin', 'user.update']); 


Kodeine的Laravel-ACL


链接: https //github.com/kodeine/laravel-acl
文档: https : //github.com/kodeine/laravel-acl/wiki
下载次数(撰写本文时): 170K
Laravel版本: 5.0及更高版本
接口是否可用:
基于Laravel Auth:

特色功能
  1. 角色和权利的同步。
  2. 继承权。
  3. 有您的刀片指令: 角色许可
  4. 成品中间件的可用性。

注意事项 迁移过程中的一些问题和解决方案:

  • 在config / acl文件中,您需要添加带有用户表名称的users_table选项,以确保稳定的迁移。
  • 您需要在纯Laravel上安装“ doctrine / dbal”软件包,以便与标准迁移“交朋友”,否则在更新字段时可能会发生错误。

数据库结构



代码示例
 //   $permissionInternship = Permission::create([ 'name' => 'internships', 'slug' => [ //   'create' => true, 'view' => true, 'update' => true, 'delete' => true, ], 'description' => 'manage internships' ]); $permissionStudent = Permission::create([ 'name' => 'internships.student', 'slug' => [ //     'create' => false, ], //   'inherit_id' => $permissionInternship->getKey(), 'description' => 'student internship permissions' ]); 


Laravel-acl,作者Mateus Junges


链接: https //github.com/mateusjunges/laravel-acl
文档: https : //mateusjunges.imtqy.com/laravel-acl/
下载次数(在撰写本文时): 1.8K
Laravel版本: 5.0及更高版本
界面的可用性:是(现成的表格)
基于Laravel Auth:

特色功能
  1. 成品范围。
  2. 组的权限同步。
  3. 拥有刀片指令: group ,@elsegroup, 许可权,@elsepermission,@ allpermission,@ allgroups,@anypermission,@anygroup
  4. 内置命令可以使技术人员创建组/权限并显示它们,以及显示用户权限。
  5. 现成的中间件的可用性:PermissionMiddleware,GroupMiddleware,HierarchicalPermissions,PermissionOrGroupMiddleware。
  6. 用于角色管理的预定义表单的可用性。

数据库结构



汇总表





结论


这些软件包中的每一个都有其自己的应用领域,因此不可能选择一个获胜者。 根据我们的估计,Laravel-permission和Bouncer最适合于复杂的角色系统,但同时有Kodeine编写的Laravel-ACL,具有角色层次结构。 Mateus Junges的Laravel-ACL是一个“新鲜”选项,并具有足够的功能来构建一组中等角色。 Sentinel是一种通用解决方案,除了角色管理外,还具有许多功能。 Laratrust适合喜欢Entrust的人。

同样,不能不提及标准的Laravel工具-Gates和Policies。 它们使区分不需要复杂权限设置的应用程序中的资源访问变得容易。 如果应用程序只有几个角色或不需要层次结构,则可以通过Gates和Policies满足您的需求。

有用的链接


Source: https://habr.com/ru/post/zh-CN481796/


All Articles