0

我的简单数据模型: 用户可以创建Articles,这使他们成为这个特定Articles对象的所有者。用户还可以邀请其他用户为其文章投稿,这使得其他用户成为该特定文章的投稿人。

所以,有 Roles OwnerContributor,还有资源Article

现在我的问题是,您将如何最好地使用 ZF2 的 ACL 和BjyAuthorize来实现这个构造?我在这里很挣扎,因为Users的角色对于资源Article不是全局有效的,但必须分配给单个Article实例。

4

1 回答 1

0

一般来说

我认为,ZF2 ACL 的优势在于根据角色结构继承权限,并且有 ACL 感知模块,如 MenuHelper。

如果您不需要继承或这些其他 - ACL 感知 - 模块,您可以创建一个非常简单的解决方案,而不需要 ACL 模块。

解决方案 1. - ACL

资源、角色和特权只是数据。因此,角色的含义取决于您在数据库中作为角色存储的内容或作为角色输入的内容,因为您为授权创建结构。

Acl 对象的 isAllowed 方法也只是基于您创建的数据结构(角色、资源和权限)的验证,您可以决定如何处理这些信息。

- 我认为 - 您需要的是对象访问控制机制 [此用户/用户组(= 角色)是否可以写入/读取(= 特权)此特定对象(= 资源)] 除了功能访问控制 [此用户/用户组(=角色)写/读(=特权)这种对象(=资源)]。

因此,如果您将文章存储为资源,将方法(写入、读取、删除等)连接为特权,并为给定的用户/组创建与这些特权的关系,您就实现了目标。

解决方案 2. - 带有断言的 ACL

如果您在 Articles 上存储了一个贡献者用户数组,您可以在创建“允许结构”时将此数组中的待检查用户的存在用作断言。

解决方案 2.1。- 带有断言的 ACL - 在单独的表中

您可以将贡献者存储在与文章表连接的单独表中。

解决方案 3. - 贡献者的序列化数组

如果您不需要 ZF2 ACL 的强大背景,您可以简单地检查文章中存储的贡献者数组中是否存在用户。

我更喜欢解决方案 1. 的集中管理空调,但我也看到了解决方案 2. 方面的优点。(解决方案 1. 混合角色和用户定义,但我已经看到了组和用户对象的混合,所以这让我不太担心。:))

上市文章

另一件事也是要考虑的:列出文章,可以编辑(贡献者)。使用 foreach 检查所有文章总是存在的。使用更多/更少的直接数据库查询会破坏 ZF2 ACL 理念。如果你也需要分页......那是个问题。:)

还有许多其他解决方案(以及它们的组合)。要找到合适的,您还必须考虑文章的数量。如果您将每篇文章的每个贡献者的行存储在角色/资源/特权表中,它们会增长得非常快。

于 2014-06-22T15:50:58.293 回答