应该在哪里执行Acl过滤?
|
假设我有三个表:
users
,books
和users_books
。
在我的一种视图中,我想显示当前用户可以访问的所有书籍的列表。如果在users_books
中存在与用户和书匹配的行,则用户可以访问该书。
有(至少)两种方法可以实现此目的:
在books
模型的fetchAll()
方法中,在users_books
表上执行某种join
。
在Acl插件中,首先从每本书中创建资源。然后,在每个用户中创建一个角色。接下来,根据“ 2”表允许或拒绝用户访问每个资源。最后,在books
模型的fetchAll()
方法中,使用当前用户作为角色,在找到的每本书上调用isAllowed()
。
我认为最后一个选项是最好的,因为这样我就可以在应用程序的其他位置使用Acl。这样就无需执行重复的访问检查。
你有什么建议?
没有找到相关结果
已邀请:
2 个回复
席酱
:有问题的事物(书籍,图片等)的ID。
:id的来源或类型。
:可以看事物的用户。 (
,
)对为您提供了一个伪FK,您可以使用它来对数据库进行完整性检查,而
可用于选择一个类以提供必要的胶水来交互ACL的特定于类型的部分并添加SQL片段,用于查询以正确加入ACL表。 或者,您可以使用命名约定将ACL Sidecar表附加到需要ACL的每个表。对于表
,您可以有一个表
,其列如下:
:
中事物的标识(带有用于完整性的真实外键)。
:用户可以看东西。 然后,您可以拥有一个ACL类,该类可以在给定基本表名称的情况下调整您的SQL。 第一种方法的主要优点是,所有内容都具有一个ACL存储,因此很容易回答诸如“用户X可以看什么?”之类的问题。第二种方法的主要优点是,您可以具有真正的参照完整性,并且可以减少代码(通过命名约定)来将它们粘合在一起。 希望以上内容对您的思考有所帮助。
森含械