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
中存在与用户和书本匹配的行,则用户可以访问书本
有(至少)两种方法可以实现这一点:
- 在
模型中的mybooks
方法中,在fetchAll()
表上执行某种类型的users\u books
join
- 在Acl插件中,首先从每本书中创建一个资源。然后,为每个用户创建一个角色。接下来,根据
表允许或拒绝用户访问每个资源。最后,在users\u books
模型的books
方法中,使用当前用户作为角色,对找到的每本书调用fetchAll()
isAllowed()
你有什么建议?我会把它全部下推到数据库中:
:正在讨论的事物(书籍、图片等)的idid
:id来自的类型或表id\u type
:可以查看对象的用户user
id
,id\u type
)对为您提供了一个伪FK,您可以使用该伪FK检查数据库的健全性,id\u type
可用于选择一个类,以提供必要的粘合剂,与ACL的类型特定部分交互,并将SQL片段添加到查询中,以正确连接ACL表
或者,您可以使用命名约定将ACL侧车表附加到每个表,而不需要ACL。对于表t
,可以有一个表t\u acl
,其列如下:
:在id
中的事物的id(带有真实的外键以确保完整性)t
:用户可以看东西用户
希望以上内容能帮助您思考。我将在存储库类中创建一个finder方法,并使用诸如getBooksByUser(User$User)之类的add方法返回图书对象集合,从而将您的数据库访问代码从模型中分离出来
不完全确定您是否需要您描述的ACL。我可能错了。谢谢,我决定使用你的第二种方法。在每个请求上构造整个Acl是没有意义的,因为大多数页面不会使用它。再次感谢!