Php 行级权限和Laravel应用程序结构

Php 行级权限和Laravel应用程序结构,php,laravel,permissions,Php,Laravel,Permissions,我想询问关于Laravel应用程序上业务逻辑的代码结构的其他意见,主要是关于行级别的权限 对于那些不知道的人来说,Laravel是一个用于PHP的MVC框架,很像Rails 为了理解,让我们假设一个多租户应用程序,其中每个用户都有自己的相册和图片,到目前为止还不错 现在,每个用户都可以邀请其他人合作(通过上传照片)到他的相册中 相册的所有者和上传图片的合作者都可以删除或更新有关该图片的信息 只有所有者可以编辑相册并邀请新的合作者 如果合作方愿意,他们可以将自己从相册中删除 Pinterest

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

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

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

  • 现在,每个用户都可以邀请其他人合作(通过上传照片)到他的相册中
  • 相册的所有者和上传图片的合作者都可以删除或更新有关该图片的信息
  • 只有所有者可以编辑相册并邀请新的合作者
  • 如果合作方愿意,他们可以将自己从相册中删除
Pinterest应该是类似的一个很好的例子,但是我们的应用程序可能要复杂3到4倍。 问题是:我应该在哪里处理这种逻辑

Laravel提出了一种拥有存储库、实体和服务的方法,我不完全理解,可能是因为缺乏好的示例。所以,要在截止日期前完成任务,最明显的第一选择就是把一切都交给控制器(ew!)。现在,深入到重构中,有许多可能的方法可以消除代码的“无差别”:

  • 我见过有人在行级别实现ACL(看起来有点愚蠢和过分)
  • 可以将模型转换为行为感知对象,而不仅仅是数据容器,比如
    $album->add_photo($photo)
    ,并检查该功能的权限
  • 也可以覆盖模型的save方法并在那里进行这些检查
  • 或者,遵循Laravel提出的具有独立关注层的道路
我认为使用($user)可以编辑的方法,比如
$album->,可以简化不允许的路由上404错误的显示,隐藏视图链接以及保存模型之前的验证

你会推荐哪一个,有人知道不使用.NET的存储库、实体和服务的简单但易懂的例子吗? 谢谢


Edit:我想一个完整的ACL系统会导致过多的开销,因为每个用户可能有数千个相关资源,但每种关联只有一个角色。例如,图片将有一个
上传者id
,相册将有一个
所有者id

我可能错了,但我认为ACL是基于对象的权限(即,用户通常可以或不能删除照片)。您需要的是更多基于模型的自定义权限(如您所说的行级别),即用户可以删除自己创建的照片(特定的照片)

我认为大多数Laravel软件包都是为基于对象的权限而设计的,但事实并非如此——这是一个伟大的隐藏宝石。我们没有在我们的项目中使用它,但我发现它确实涵盖了我们需要的所有基础

我们在我们的应用程序上有非常高级的模型权限,我在我的模型中分散了这些权限,但我采取了一种非常以模型为中心的方法,这不一定是非常“拉威尔式”的。在您使用delete的示例中,我将覆盖模型中的delete方法,或者侦听有说服力的事件并在那里阻止它。如果您必须防止对某些属性进行读/写操作,您甚至可以通过扩展验证器或使用自定义的mutator/getter、序列化器或侦听事件来做到这一点。更多关于在我的问题/答案中添加业务逻辑的信息,请点击此处:

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

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

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

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

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

您可能会发现这有点关联:您的答案确实不错。尽管如此,我们现在希望避免的是每行都有ACL,特别是因为没有组,在最坏的情况下,每个资源有两种不同的权限类型,一种已经由外部
所有者id
键绑定。我们假设拥有一个完整的ACL系统会导致过多的开销。你对图层的解释让我更清楚了,tho。