2

我花了一整天的时间寻找有关如何在SO中实现Zend_Acl的教程和答案,就像在其他站点一样。我头痛了。 :XZend Acl - 模块,控制器,动作和模型

我看到有人使用它来允许或不允许访问某些控制器/操作和其他人说这种方式不正确,并且应该允许或不允许基于模型的访问。呵呵,第二个似乎是可行的,但是,这意味着对于每个控制器我需要一个模型?因为看起来,在第二种选择之后,我只能在用户访问时立即阻止用户访问,例如编辑帖子。但我想阻止访问编辑帖子的控制器的操作。

如果我想阻止访问角色X到控制器Z的动作Y的用户,如果我遵循第二个选择,我该怎么做?

一个真正的应用程序的例子将是非常受欢迎的。

此信息可以改善您的答案: 我使用Doctrine 2作为ORM,并且我有一个模块Admin。我的应用程序的实际结构是这样的:

application 
    - MYAPP 
    - configs 
    - controllers 
    - layouts 
    - views 
    - library 
     - MYAPP ;This folder is in the include path 
    - modules 
     - admin 
+0

伙计 - 您需要提供更多信息。您的特定情况的ACL配置是什么?我期望您添加一些代码片段,以便我们可以理解您的问题。 – emeraldjava 2011-06-11 21:16:49

+0

@emeraldjava,我没有实际的ACL配置,就像我说我对各种现有的实现感到困惑。以下是我一直在阅读的一些链接,可以看出,它们遵循不同的路径:http://weierophinney.net/matthew/archives/201-Applying-ACLs-to-Models.html和http:// stackoverflow.com/questions/2046608/practical-zend-acl-zend-auth-implementation-and-best-practices。 – JCM 2011-06-11 21:56:25

回答

5

我承认是没有Zend_Acl专家,但对我来说,使用Zend_Acl的本质就是确定的角色,资源和权限。角色通常很明显。一旦你清楚地确定了资源,特权通常会变得明显。

对我来说,关键是确定资源

在你的情况下,这听起来像你已明确确定控制器作为资源。如果您需要更细粒度的访问控制,则可以将权限定义为操作。这似乎足够灵活,以至于即使不需要使用模型的控制器(可能是仅向特定类型的登录用户显示的静态页面等)也可以由ACL控制。

可能有些情况下,您发现您的资源/权限“自然”对应于模型/方法。但是,如果控制器/操作更符合您对程序流程和ACL要求的理解,我认为您不应该强迫您将ACL强制进入该范例。

不是真的直接回答你的问题。更像是忠于你自己阅读情况的建议。

+0

完全同意,您可以根据模块(模块允许/禁止)以不同的资源级别结束,然后对于其他模块,您可以阻止基于控制器的访问,然后针对其他模块和模型上的其他模块访问。请不要犹豫为每个策略构建几个独立的Acl对象(并缓存它们)(并且每个模块有1个策略通常是有用的) – regilero 2011-06-12 08:50:42

+0

感谢您的回复。@regilero你是说如果我有几种类型的资源,我需要为每个资源定义一个acl(一个基于控制器,另一个基于模型)? – JCM 2011-06-12 13:14:19

+0

@Jonathan:是的,你可以,但不是你必须的,但是如果你想应用多层ACL检查,你应该尝试使用几个Acl对象,这样你就可以保持它们的小,可理解和单元测试(并且可以缓存 - 有时拥有大量规则的大型ACL对象甚至应该按角色分割)。 – regilero 2011-06-14 14:45:14