我最近完成了整个ACL过程,并对结果感到满意。下面是我实现的:
扩展Zend_ACL
,并使用其构造函数中添加你的角色(包括继承关系)。
创建一个加载到引导中的动作助手。 (您需要尽早加载,以便您可以使用它的挂钩,如preDispatch
)。
编辑要保护和调用新的ACL助手,传递的是要应用于此控制器的规则在每个控制器,例如在init()
:allow('member', 'edit);
真正的工作是做由行动助手。它有四个功能:
init()
- 实例化新的ACL类,然后将其镜像电流控制器,
即名称的新资源。 $this->_resource = $this->getRequest()->getControllerName())
。
preDispatch()
- 使用Zend_Auth
(或指定用户未登录的guest的默认值)获取当前用户类型。使用ACL,
,即$this->_acl->isAllowed($currentRole, $resource, $action)
检查请求是否被允许。
注意请求的操作成为ACL特权。
allow()
- 这只是代理到ACL对象上的allow()
函数。它由控制器构造函数调用,以在ACL中设置规则。
deny()
- 至于允许。
所以,在运行时,一系列事件如下:
动作助手的引导加载。这a)实例化自定义ACL对象,该对象设置自己的角色,然后b)将当前控制器名称添加为资源。
控制器init()
运行。它调用助手的allow()
和deny()
方法来设置规则。
运行帮助程序preDispatch()
,如果!isAllowed()
,用户被重定向。
我对数据库进行了认证,但是如果您使用的是LDAP
,则适用同样的逻辑。 (在这种情况下,Apache的基本认证提示是否是默认的挑战?如果不是,这可能会增加额外的复杂性)。
我改编自Rob Allen(Zend Framework in Action)的书以及其他各种资源。请注意,一些Zend专业人员推荐基于模型的ACL(而不是控制器操作)。我会把这个想法放在赛道上。
上述方法的一个特别方便的方面是,持续维护ACL规则非常简单。在您正在使用特定控制器时,您在init()
中设置了其ACL
规则。
谢谢你这样详细的答案,但我不知道我需要ACL - 我有一个Intranet应用程序,我需要的是通过身份验证从LDAP获取用户信息。那么“基本的Apache auth” - 它在某些条件下的必要原因(Kerberos是下一个任务)呢? – Chvanikoff 2011-04-09 07:00:33