使用父/子关系构建Zend_Acl和CRUD

时间:2011-01-25 09:23:58

标签: zend-framework acl zend-acl

我想知道如何构建具有父/子关系的CRUD的ACL。

EG。项目有TodoLists。 TodoLists有Todos

项目有各种控制器动作

  • /项目/添加
  • /项目/编辑/ {PROJID}
  • /项目/删除/ {PROJID}
  • /待办事项-列表/添加/ {PROJID}
  • /待办事项-列表/编辑/ {todoListId}
  • ...

正如您所看到的那样,在层次结构中,某些操作的ID不是指自己(例如todo-lists controller - > todo-list资源),而是指其父级

因此,我已经设置(通常),它看起来像这样

  • ACL控制器插件(preDispatch)
    • 将角色设置为已登录用户或“未经身份验证的”
    • 将资源设置为控制器名称
    • 将权限设置为操作名称
    • 如果设置了请求参数'id',则获取实现Zend_Acl_Resource_Interface的实际实体(我正在使用Doctrine ORM)。这就是复杂性出现的地方。我通常会从控制器名称获取资源,但是例如。使用/todo-lists/add我必须知道获取父实体(Project)。有了这个设置,我将不得不使用'addTodoList'这样的特权。这样,项目acl断言类就会有TodoLists的东西。控制器动作和控制器之间也会断开连接。 ACL逻辑。那可以吗?

也许我应该在ProjectsController而不是TodoListsController中添加addTodoListAction?这将简化我的ACL代码,我不需要检查和修改资源/权限?我可以直接从请求参数(控制器和操作名称)中获取这些信息。

如何设置这样的ACL?

1 个答案:

答案 0 :(得分:2)

使用Zend_Acl_Assertion,为projectid和todoId创建断言。在给予许可时

$myAcl->allow($role,'projects','edits',new My_Project_Assertion());

并且你不能使用动作“addTodoListAction”,因为有大写字母(或定义你自己的调度员)addtodolistAction wd work;