【问题标题】:Implementing Zend_Acl in a modular structured application with identical controller names在具有相同控制器名称的模块化结构化应用程序中实现 Zend_Acl
【发布时间】:2012-01-03 13:47:30
【问题描述】:

我对 Zend 框架还是很陌生。我在一个仍在为学校工作的项目中开始学习它。我有点纠结于如何处理 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”等。

【问题讨论】:

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


    【解决方案1】:

    我也对其他人的看法很感兴趣,但我想我会为您提供一种可能的解决方案。

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

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

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

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

    【讨论】:

    • 非常感谢,真不敢相信我没想过将列表彼此分开。我很感兴趣还有其他解决方案,但这对我的项目来说似乎是一个很棒的解决方案——我的截止日期有点快,所以无论哪种方式都没有太多选择!
    • @IvoCoumans - 我对Zend_Auth stackoverflow.com/questions/4318599/… 使用类似的东西
    • @IvoCoumans - 我如何为我的应用程序实现 ACL stackoverflow.com/questions/2277266/does-zend-acl-suit-my-needs
    • 只是一个快速更新 - 我已经成功地为我的前端和我的管理部分实现了一个 ACL,它的工作就像一个魅力!再次感谢。 @Sonny - 感谢您的链接,它们提供了一些非常有趣的信息和见解。
    猜你喜欢
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-26
    • 2017-03-08
    • 2013-06-14
    • 2017-05-18
    • 1970-01-01
    相关资源
    最近更新 更多