在具有相同控制器名称的模块化结构化应用程序中实现Zend_Acl


Implementing Zend_Acl in a modular structured application with identical controller names

我是Zend Framework的新手。我是在一个我仍在为学校做的项目中开始学习它的。我有点纠结于如何处理ACL和我的模块化结构(我真的很喜欢),而且在互联网上进行研究似乎没有得到我需要的信息。这可能是因为我对这个框架还不是很有经验,但我仍然认为我应该在这里问一下。提前感谢!

目前,根据我研究的大多数最佳实践,我创建了一个模块化结构,如下所示:

application/
  modules/
    admin/
    default/

我使用一个插件来控制我的ACL,像这样(为了简单/可读性,我只添加了一小部分):

$acl = new Zend_Acl();
$acl->addRole(new Zend_Acl_Role('guest'))
    ->addRole(new Zend_Acl_Role('member'), 'guest');
    ->addRole(new Zend_Acl_Role('admin'), 'member');
$acl->addResource(new Zend_Acl_Resource('index'));
    ->addResource(new Zend_Acl_Resource('admin:index'));
$acl->allow('guest', 'index', array('index'));
    ->allow('member', 'index', array('userpanel'));
    ->allow('admin');

无论如何,ACL都在默认模块上工作得很好-甚至在管理模块上,但是当我有相同的控制器名称和操作时,问题就出现了,例如:

This action will allow users to edit their own account
Module: Default
Controller: User
Action: Edit
This action will allow an admin to edit any account
Module: Admin
Controller: User
Action: Edit

当我像这样在ACL中设置规则时:

$acl->allow('member', 'user', array('edit'));

用户还将被允许访问用户控制器上的管理员编辑页面。我如何告诉ACL模块之间存在差异?在向ACL添加资源时,我见过许多使用"admin:user"而不是"user"作为控制器/资源名称的示例。但是,当控制器和/或操作名称相同时,这似乎不起作用。

所以,最大的问题是:在我目前的情况下,我如何解决这个问题,或者你建议我如何构建我的应用程序来避免这个问题?我宁愿不诉诸于使用额外的控制器前缀,如"Admin_AdminUserController"或只是删除模块一起,只是使"adminEditAction"等。

我对别人的看法也很感兴趣,但我想我可以为你提供一个可能的解决方案。

在我当前的项目中,我对默认(最终用户)模块和管理模块使用单独的ACL。除此之外,对于管理模块,我扩展了Zend_Auth,并将其设置为使用不同的会话名称空间(Zend_Auth_admin),因此用户登录与管理员登录完全隔离。一个人可以同时以用户和管理员的身份登录,因为它使用了两个不同的Zend_Session名称空间。

也就是说,我们在用户ACL中仍然有一个admin角色,因为我们允许admin用户从admin模块登录到任何用户帐户(我们的用户帐户中没有个人/敏感信息)。

在我们的例子中,当管理ACL和用户ACL分开时,阅读和理解ACL会容易得多,因为管理ACL有很多规则,并且一些逻辑完全与用户ACL分开。

这可能是或可能不是一个有用的方法在你的项目,但我想我把它放在那里作为一种可能性。好运!