我是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”等。
答案 0 :(得分:3)
我对别人的意见也很感兴趣,但我想我会为你提供一个可能的解决方案。
在我当前的项目中,我使用单独的ACL作为我的默认(最终用户)模块和我的管理模块。除此之外,对于管理模块,我扩展了Zend_Auth并将其设置为使用不同的会话命名空间(Zend_Auth_admin),因此用户登录与管理登录完全隔离。一个人可以作为用户和管理员同时登录,因为它使用两个不同的Zend_Session名称空间。
也就是说,我们仍然在用户ACL中有管理员角色,因为我们允许管理员用户从管理模块登录任何用户帐户(没有个人/敏感信息是我们用户帐户的一部分)。
在我们的例子中,当管理员ACL和用户ACL分开时,读取和理解ACL要容易得多,因为管理ACL有很多规则,而且某些逻辑与用户ACL完全分开。
这在您的项目中可能是也可能不是一种有用的方法,但我认为我会把它作为一种可能性。祝你好运!