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

时间:2012-01-03 13:47:31

标签: php zend-framework web-applications module acl

我是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”等。

1 个答案:

答案 0 :(得分:3)

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

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

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

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

这在您的项目中可能是也可能不是一种有用的方法,但我认为我会把它作为一种可能性。祝你好运!

相关问题