Zend_ACL基于用户的动态权限

时间:2010-08-13 14:48:01

标签: php zend-framework zend-acl

是否可以根据Zend Framework应用程序中的动态元素为用户分配个人权限?

我有这样的表:

clients (id, name, contact_name, contact_number, logo, active)
modules (id, client_id, module_id, active)
permissions (id, user_id, client_id, module_id)
users (id, username, password, email, realname)

我需要做的是允许特定用户访问每个客户端的特定模块,但我无法找到任何方法让Zend_ACL执行此操作。最有效的方法是什么?

编辑:道歉,我忘了添加细节。我必须允许管理员在管理界面中授予和撤消用户的权限。

3 个答案:

答案 0 :(得分:2)

看看这篇文章,因为我认为它可能有你想要的一些东西。仅供参考,这是该系列的第3部分,但与您的要求更为相关。

http://codeutopia.net/blog/2009/02/18/zend_acl-part-3-creating-and-storing-dynamic-acls/

答案 1 :(得分:1)

让我们回过头来讨论这个话题,最好完成它,这在实现中有点困难。 让我们对我们所拥有的问题有所了解: Ben:我不知道你的项目是怎么回事,但让我们创建一个类似的场景, 我们为访客,客户,管理员提供了一个网站: 我们需要在数据库中使用一个表来保存角色名称,并为每个角色保存其权限

Roles (idRole, nameRole)
Permissions (We will speak about it later)

我们可以说,稍后我们需要为我们的应用程序设置更多角色,因此我们将为管理员设置一个页面,为每个角色分配权限(如Drupal和Joomla),其中一个解决方案是找到应用程序中的所有模块,然后获取每个模块的控制器以及每个Controller的操作。 然后我们必须告诉Zend_Acl从数据库中的Roles Table设置我们的角色,而Resources是每个控制器的Zend Modules-> Actions。 因此我们需要一个表来存储所有模块,对于每个模块,我们将需要控制器和操作

Modules (idModule, nameModule)
Controllers (idController, nameController, idModule_FK)
Actions (idAction, nameAction, descriptionAction, idController_FK)

说明字段将从操作描述示例

中获取
/**
* @description := Action to edit Roles
**/
public function editAction {}

现在让我们完成我们的数据库结构

Roles (idRole, nameRole)
Permission (idRole, allowedPermission, idAction, dateTimeAssigned)
Modules (idModule, nameModule)
Controllers (idController, nameController, idModule_FK)
Actions (idAction, nameAction, descriptionAction, idController_FK)

这是一个通用结构,我可以找到,直到现在,我试图找回所有模块/控制器/动作,当它完成时,我会在这里发回(插件类)然后我们会尝试使用Zend_Acl Dynamic来处理这个问题(对他人的贡献)。

后续步骤:要在Library/App/Action/Helper中创建一个插件,如果某人已完成,请回帖以获得有关它的一般性贡献, 然后我们将专注于使用Doctrine ORM和Zend Project保存数据, 第三步是创建一个Controller,它根据数据库信息(角色,权限,操作)动态创建Zend_Acl。

任何建议/想法/建议,这里应该继续,直到完成。

亲切的问候,

答案 2 :(得分:0)

ACL背后的基本框架可以是这样的

$acl = new Zend_Acl();

// allow user with ID 1 access reports section for client with ID 4
$acl->allow(
  new Zend_Acl_Role('user_1'),
  new Zend_Acl_Resource('reports'),
  'client_4'
);

// allow administrator access reports module for all clients
$acl->allow(
  new Zend_Acl_Role('administrator'),
  'reports'
);

等等...... 这在很大程度上取决于你喜欢哪种风格。 Zend_Acl非常灵活,我同意该手册可以编写更多示例和最佳实践,但最终并不难以自行解决。