在开发有用户帐户的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:是
特色功能- 用于创建/分配权限的工匠命令的可用性。
- 按角色和权利完成范围。
- 由于软件包使用Laravel Auth Gates,因此可以使用标准工具验证用户权限。
- 使用软件包的刀片指令的能力: 角色 (@hasrole),@ hasanyrole,@ hasallroles,@ unlessrole。
- 权利和角色的同步。
注意:当对策略调用authorize()时,如果权限与policy具有相同的名称,则它将起作用,而不是policy。
数据库结构
代码示例
约瑟夫·西尔伯的保镖
链接: https : //github.com/JosephSilber/bouncer文档: https : //github.com/JosephSilber/bouncer#introduction下载次数(撰写本文时): 418K
Laravel版本:从5.1.20
接口的存在:否(可以使用
package )
基于Laravel Auth:是
特色功能- 无需Laravel即可使用。
- 权利和角色的同步。
- 对权利施加限制的能力(针对特定类型的模型或特定实例)。
- 颁发“其”实体的所有权利:使用“ toOwn”功能,您可以授予属于用户的实体的所有权利(可以自定义user_id和$ user-> id字段的比较)。 您可以使用“至”功能限制授予的权限。
- 多租户支持(基于范围功能)。
- 使用“作用域”功能可以根据既定条件(基于唯一标识符)分隔角色和权限-例如,管理面板中的权限和网站的公共部分。
- 控制台artisan命令从未使用的权限中清除数据库。
- 快速禁止用户或删除禁令的能力(禁止的能力)。
注意:您只需一行
即可创建角色和权限。
数据库结构
代码示例通过模型类或实例对权限的限制: 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:否
特色功能- 这是ENTRUST( https://github.com/Zizaco/entrust )的分支 。
- 有刀片指令。
- 由于用它们自己的标准Laravel命令替换了,因此无法使用Blade指令can-您将不得不使用$ user-> can('edit-user')或权限指令。
- 角色/权限同步。
- 可用性功能-同时验证角色和权限。
- 准备好的中间件。
- 基于团队的多租户。
数据库结构
代码示例 $user->hasRole(['owner', 'admin']); $user->can(['edit-user', 'create-post']); $user->hasRole('owner|admin'); $user->can('edit-user|create-post'); $user->owns($post)
Cartalyst的前哨
链接: https : //github.com/cartalyst/sentinel文档: https : //cartalyst.com/manual/sentinel/3.x下载次数(在撰写本文时): 957K
Laravel版本: 6.2
接口是否可用:否
基于Laravel Auth:否
特色功能- 它不仅包括角色和权利,还包括与注册有关的所有内容。
- 该软件包是不可知的框架,即 它不仅可以在Laravel中使用-您只需要使用composer安装以下依赖项:光照/数据库,光照/事件,symfony / http-foundation。
- 使用Sentinel Expired-Permissions插件,您可以发布时间权限。
- 通过Sentinel Multitenancy附加组件支持Multitenancy。
注意:在纯Laravel 6.2和PostgreSQL上安装时,在迁移过程中会出现错误:users表已经存在。 在这种情况下,您必须更改标准迁移:
数据库结构
代码示例
Kodeine的Laravel-ACL
链接: https : //github.com/kodeine/laravel-acl文档: https : //github.com/kodeine/laravel-acl/wiki下载次数(撰写本文时): 170K
Laravel版本: 5.0及更高版本
接口是否可用:否
基于Laravel Auth:否
特色功能- 角色和权利的同步。
- 继承权。
- 有您的刀片指令: 角色 , 许可 。
- 成品中间件的可用性。
注意事项 迁移过程中的一些问题和解决方案:
- 在config / acl文件中,您需要添加带有用户表名称的users_table选项,以确保稳定的迁移。
- 您需要在纯Laravel上安装“ doctrine / dbal”软件包,以便与标准迁移“交朋友”,否则在更新字段时可能会发生错误。
数据库结构
代码示例
Laravel-acl,作者Mateus Junges
链接: https : //github.com/mateusjunges/laravel-acl文档: https : //mateusjunges.imtqy.com/laravel-acl/下载次数(在撰写本文时): 1.8K
Laravel版本: 5.0及更高版本
界面的可用性:是(现成的表格)
基于Laravel Auth:否
特色功能- 成品范围。
- 组的权限同步。
- 拥有刀片指令: group ,@elsegroup, 许可权,@elsepermission,@ allpermission,@ allgroups,@anypermission,@anygroup
- 内置命令可以使技术人员创建组/权限并显示它们,以及显示用户权限。
- 现成的中间件的可用性:PermissionMiddleware,GroupMiddleware,HierarchicalPermissions,PermissionOrGroupMiddleware。
- 用于角色管理的预定义表单的可用性。
数据库结构
汇总表

结论
这些软件包中的每一个都有其自己的应用领域,因此不可能选择一个获胜者。 根据我们的估计,Laravel-permission和Bouncer最适合于复杂的角色系统,但同时有Kodeine编写的Laravel-ACL,具有角色层次结构。 Mateus Junges的Laravel-ACL是一个“新鲜”选项,并具有足够的功能来构建一组中等角色。 Sentinel是一种通用解决方案,除了角色管理外,还具有许多功能。 Laratrust适合喜欢Entrust的人。
同样,不能不提及标准的Laravel工具-Gates和Policies。 它们使区分不需要复杂权限设置的应用程序中的资源访问变得容易。 如果应用程序只有几个角色或不需要层次结构,则可以通过Gates和Policies满足您的需求。
有用的链接