Zend Framework:你可以在没有plugins目录的情况下进行ACL吗?

时间:2011-07-19 11:19:55

标签: zend-framework acl

我无法理解ZF中ACL的规则,文档也不清楚。我正在为所有网站使用通用的Zend库。到目前为止没有问题,但现在每个演示或示例都说您应该将ACL类(acl.php)作为插件放在libraries目录中。 Zend公司/库/我的/控制器/插件/.

我不想这样做,因为它违背了共享公共框架目录的目的。

是否有人为每个网站/网络应用程序使用单独的acl.php类文件完成或了解如何完成ACL?

由于

3 个答案:

答案 0 :(得分:1)

您永远不应该将文件添加到Zend库目录中 - 您是否有指向教程的任何链接?这些文件应该放在应用程序命名空间下的库目录中,为您提供如下结构:

application/
library/
    Zend/
        (ZF files)
    Foo/
        Controller/
            Plugin/
                ...

application/pluginsapplication/controller/helpers或其他地方,具体取决于您所采取的方法。

编辑:听起来像是一个控制器插件就是教程推荐的内容,在这种情况下你需要一个像Yourapp_Plugin_Acl这样的类(用你的应用程序命名空间替换'Yourapp')它将生活在application/plugins/Acl.php

答案 1 :(得分:1)

您不必将库中的acl.php作为插件放置。自动加载器会很好地加载类,Zend_Acl的技巧就是用你的角色和资源来启动类的实例。

自从我接触Zend Framwork以来已经有一段时间了,但我会试着引导你朝着正确的方向前进。

  1. 在引导程序中,创建Zend_Acl对象

    $ acl = new Zend_Acl(); //查看有关如何添加角色和资源的文档

  2. 现在在Controller目录中创建一个Plugin文件夹,这将允许您使用您的acl进行身份验证。

  3. 在里面创建一个扩展Zend_Controller_Plugin_Abstract的新类,为它自动加载器提取正确的类名。

  4. 将您创建的acl存储在注册表中并在插件中覆盖preDispatch方法,从这里您可以访问请求,并且您可以根据需要验证acl(来自zend注册表)。 (有些人将控制器/动作作为其他模型的资源。它非常自由。

  5. 使用前端控制器注册插件。

    $ frontController-> registerPlugin(new My_Controller_Plugin_Acl());

  6. 这可能是其他教程的建议(或其变体),有时可能会有点混乱。

答案 2 :(得分:1)

最终,只要您的自动加载器配置足以找到它,您就可以将它放在任何您想要的位置。确切地说,如何使用它取决于您试图保护的资源和特权。

但是您认为您在实例化ACL和查询ACL时感到困惑。

您很可能在引导期间实例化/填充ACL对象,并将其存储在Bootstrap注册表或Zend_Registry单例中。

如果您的资源是控制器而您的权限是操作,则通常使用查询ACL对象的preDispatch()插件拦截调度周期。

所以,我们真的在看两个不同的类/对象:

  1. 一个是ACL本身,扩展了Zend_Acl。这个可以命名为Application_Model_Acl并放在文件application/models/Acl.php

  2. 另一个是前端控制器插件。这个可以命名为Application_Plugin_Acl并存储在文件application/plugins/Acl.php

  3. [请注意,这两个都假定我们正在使用应用程序命名空间Application。另请注意,这些都是特定于项目的。]

    当然,所描述的插件需要被赋予ACL对象才能完成它的工作,所以你的Bootstrap可能有这样的方法:

    protected _initAclPlugin()
    {
        $acl = new Application_Model_Acl();
        $plugin = new Application_Plugin_Acl($acl);
        Zend_Controller_Front::getInstance()->registerPlugin($plugin);
    }
    

    但请记住,这只是使用ACL的一种方法。在某些情况下,您的ACL可能不仅限于控制器/操作。在这种情况下,您可能还需要将ACL对象传递给查询它的其他模型/服务。在这种情况下,您可能在Bootstrap中使用单独的方法来创建ACL对象并将其存储在Bootstrap注册表中。然后你的控制器 - 甚至依赖注入系统 - 可以从那里获取它并将其传递给可能需要它的任何下游模型/服务。

    [你知道,看看我的回答,它与@linead没有什么不同。同样的想法,不同的话,但他完全进入了。]