2

我想询问其他关于 Laravel 应用程序业务逻辑代码结构的意见,主要是关于行级别的权限。

对于那些不知道的人,Laravel 是一个 PHP 的 MVC 框架,很像 Rails。

为了便于理解,让我们假设一个多租户应用程序,其中每个用户都有自己的相册和图片,到目前为止一切正常。

  • 现在,每个用户都可以邀请其他人协作(通过上传照片)到他的相册中。
  • 上传图片的相册所有者和合作者都可以删除或更新有关该图片的信息。
  • 只有所有者可以编辑相册并邀请新的协作者。
  • 如果合作者愿意,他们可以将自己从相册中删除。

Pinterest 应该是类似的一个很好的例子,但我们的应用程序可能要复杂 3 到 4 倍。问题是:我应该在哪里处理这种逻辑?

Laravel 提出了拥有存储库、实体和服务的方法,我不完全理解,可能是因为缺乏好的例子。因此,满足这些最后期限的明显首选是将所有内容都放在控制器上(ew!)。现在,深入研究重构,有很多可能的方法可以使我们的代码不“意大利面”:

  • 我见过人们在行级别实现 ACL(看起来有点愚蠢和矫枉过正)
  • 可以将模型转变为行为感知对象,而不仅仅是数据容器,例如$album->add_photo($photo)并检查该功能的权限
  • 也可以覆盖模型的保存方法并在那里进行这些检查
  • 或者,遵循 Laravel 提出的具有独立关注层的道路

我想拥有类似的方法$album->can_be_edited_by($user)可以简化在不允许的路线上显示 404 错误、隐藏视图的链接以及在保存模型之前进行验证

您会推荐哪一个,是否有人知道不使用 .NET 的存储库、实体和服务的任何简单但易于理解的示例?谢谢!

编辑:我猜一个完整的 ACL 系统会导致过多的开销,因为每个用户可能有数千个资源关联,但每种关联只有一个角色。例如,图片有一个uploader_id,相册有一个owner_id

4

2 回答 2

1

我可能是错的,但我认为 ACL 是基于 OBJECT 的权限(即,用户可以或不能删除 GENERAL 中的照片)。您想要的是更多基于模型的自定义权限(如您所说的行级别),即用户可以删除他们自己创建的照片(特定的照片)。

我认为大多数 Laravel 包都是为基于对象的权限而设计的,但不是https://github.com/deefour/authorizer - 这是一个很棒的隐藏宝石。我们没有在我们的项目中使用它,但我发现它确实涵盖了我们需要的所有基础。

我们的应用程序拥有非常高级的模型权限,我将它们分散在我的模型中,但我采用了非常以模型为中心的方法,这不一定是非常“laravel-esque”。在您的删除示例中,我将覆盖模型中的删除方法或侦听雄辩的事件并在那里阻止它。如果你必须阻止对某些属性的读/写,你甚至可以通过扩展验证器或使用自定义 mutators/getter、序列化程序或监听事件来做到这一点。更多关于在我的问题/答案中添加业务逻辑的地方:https ://stackoverflow.com/a/27804817/796437

我仍在努力寻找最好的方法,如果我这样做了,我会更新这个 - 但我想我会发布。

于 2016-12-22T05:51:14.843 回答
0

在 Laravel 中,您可以使用策略或解决方案,例如Symfony Voters。对于 Laravel 存在相同的包 - Laravel Simple Voters

使用它,您可以检查对自定义对象的访问,如下所示:

Access::isGranted('edit', $post) // current user can edit this post?

例如,如果您希望检查对控制器的请求,您可以将此逻辑放入中间件中。

于 2017-05-16T07:18:08.477 回答