Php 应在何处使用Acl执行过滤?

Php 应在何处使用Acl执行过滤?,php,zend-framework,zend-acl,Php,Zend Framework,Zend Acl,假设我有三个表:users,books,和users\u books 在我的一个视图中,我想显示当前用户有权访问的所有书籍的列表。如果users\u books中存在与用户和书本匹配的行,则用户可以访问书本 有(至少)两种方法可以实现这一点: 在books模型中的myfetchAll()方法中,在users\u books表上执行某种类型的join 在Acl插件中,首先从每本书中创建一个资源。然后,为每个用户创建一个角色。接下来,根据users\u books表允许或拒绝用户访问每个资源。最后

假设我有三个表:
users
books
,和
users\u books

在我的一个视图中,我想显示当前用户有权访问的所有书籍的列表。如果
users\u books
中存在与用户和书本匹配的行,则用户可以访问书本

有(至少)两种方法可以实现这一点:

  • books
    模型中的my
    fetchAll()
    方法中,在
    users\u books
    表上执行某种类型的
    join
  • 在Acl插件中,首先从每本书中创建一个资源。然后,为每个用户创建一个角色。接下来,根据
    users\u books
    表允许或拒绝用户访问每个资源。最后,在
    books
    模型的
    fetchAll()
    方法中,使用当前用户作为角色,对找到的每本书调用
    isAllowed()
我认为最后一个选项是最好的,因为这样我就可以在应用程序的其他地方使用Acl。这将消除执行重复访问检查的需要


你有什么建议?

我会把它全部下推到数据库中:

  • 通过连接在数据库中进行此操作将比在PHP中进行过滤快得多
  • 在数据库中这样做可以让您正确地分页,而不必像获取比您需要的更多的数据那样跳转(如果最终抛出太多数据,则获取更多数据)
  • 我可以想出两种广泛的策略来管理ACL

    您可以使用一个表在数据库中设置显式ACL,如下所示:

    • id
      :正在讨论的事物(书籍、图片等)的id
    • id\u type
      :id来自的类型或表
    • user
      :可以查看对象的用户
    id
    id\u type
    )对为您提供了一个伪FK,您可以使用该伪FK检查数据库的健全性,
    id\u type
    可用于选择一个类,以提供必要的粘合剂,与ACL的类型特定部分交互,并将SQL片段添加到查询中,以正确连接ACL表

    或者,您可以使用命名约定将ACL侧车表附加到每个表,而不需要ACL。对于表
    t
    ,可以有一个表
    t\u acl
    ,其列如下:

    • id
      :在
      t
      中的事物的id(带有真实的外键以确保完整性)
    • 用户
      :用户可以看东西
    然后,您可以拥有一个ACL类,该类可以在给定基表名称的情况下调整SQL

    第一种方法的主要优点是,所有内容都有一个ACL存储区,因此很容易回答诸如“用户X可以看什么?”之类的问题。第二种方法的主要优点是,您可以拥有真正的引用完整性,并且可以使用较少的代码(通过命名约定)将其粘合在一起


    希望以上内容能帮助您思考。

    我将在存储库类中创建一个finder方法,并使用诸如getBooksByUser(User$User)之类的add方法返回图书对象集合,从而将您的数据库访问代码从模型中分离出来


    不完全确定您是否需要您描述的ACL。我可能错了。

    谢谢,我决定使用你的第二种方法。在每个请求上构造整个Acl是没有意义的,因为大多数页面不会使用它。再次感谢!