应该在哪里执行Acl过滤?

| 假设我有三个表:
users
books
users_books
。 在我的一种视图中,我想显示当前用户可以访问的所有书籍的列表。如果在
users_books
中存在与用户和书匹配的行,则用户可以访问该书。 有(至少)两种方法可以实现此目的: 在
books
模型的
fetchAll()
方法中,在
users_books
表上执行某种
join
。 在Acl插件中,首先从每本书中创建资源。然后,在每个用户中创建一个角色。接下来,根据“ 2”表允许或拒绝用户访问每个资源。最后,在
books
模型的
fetchAll()
方法中,使用当前用户作为角色,在找到的每本书上调用
isAllowed()
。 我认为最后一个选项是最好的,因为这样我就可以在应用程序的其他位置使用Acl。这样就无需执行重复的访问检查。 你有什么建议?     
已邀请:
我会将其全部推送到数据库中: 通过JOIN在数据库中完成此操作比过滤PHP中的内容要快得多。 在数据库中执行此操作将使您能够正确地分页,而不必跳过麻烦,例如获取所需的更多数据(如果最终抛出过多数据,则获取更多数据)。 我可以想到两种可用于管理ACL的广泛策略。 您可以使用单个表来在数据库中设置显式ACL,如下所示:
id
:有问题的事物(书籍,图片等)的ID。
id_type
:id的来源或类型。
user
:可以看事物的用户。 (
id
id_type
)对为您提供了一个伪FK,您可以使用它来对数据库进行完整性检查,而
id_type
可用于选择一个类以提供必要的胶水来交互ACL的特定于类型的部分并添加SQL片段,用于查询以正确加入ACL表。 或者,您可以使用命名约定将ACL Sidecar表附加到需要ACL的每个表。对于表
t
,您可以有一个表
t_acl
,其列如下:
id
t
中事物的标识(带有用于完整性的真实外键)。
user
:用户可以看东西。 然后,您可以拥有一个ACL类,该类可以在给定基本表名称的情况下调整您的SQL。 第一种方法的主要优点是,所有内容都具有一个ACL存储,因此很容易回答诸如“用户X可以看什么?”之类的问题。第二种方法的主要优点是,您可以具有真正的参照完整性,并且可以减少代码(通过命名约定)来将它们粘合在一起。 希望以上内容对您的思考有所帮助。     
我将通过在存储库类中创建一个finder方法,并使用诸如getBooksByUser(User $ user)之类的add方法来返回书籍对象的集合,从而从模型中分离出数据库访问代码。 不能完全确定您需要使用所描述的ACL。我可能错了。     

要回复问题请先登录注册