使用Zend MVC实现api密钥以访问特定控制器操作的好方法是什么?
我目前使用会话cookie将Zend_Acl与Zend_Auth结合使用,但我希望通过Zend_Acl + Zend_Auth(通常是从数据库等读取以刷新缓存的操作)来对crontabbed进行一些操作。
如何利用Zend_Acl跟踪api密钥进行登录,并根据这些密钥从Zend_Auth中读取正确的身份/角色?
答案 0 :(得分:0)
Zend_Auth将为您处理大部分身份验证。使用
$auth = Zend_Auth::getInstance();
if (!$auth->hasIdentity()) {
//call a custom login action helper to try login with GET-params
}
if ($auth->hasIdentity())
$identity = $auth->getIdentity();
//...
}
现在您可以根据身份确定Zend_Acl_Role。我总是为每个用户创建一个新角色,让这个角色“继承”用户实际拥有的所有通用角色。
// specific user with $identity is given the generic roles staff and marketing
$acl->addRole(new Zend_Acl_Role('user'.$identity), array('staff', 'marketing'));
当然,您可以从数据库中检索角色数组。然后,您必须指定每个角色的权限。您可以对其进行硬编码或将这些信息保存在数据库中。
$acl->allow('marketing',
array('newsletter', 'latest'),
array('publish', 'archive'));
在您的控制器中,您现在可以检查
$acl->isAllowed('user'.$identity, Zend_Acl_Resource ...)
如果您有一个更复杂的访问控制,其权限取决于某些类(可能是MCV模型)中的信息,请让这些类实现Zend_Acl_Resource_Interface。然后使用此类作为Zend_Acl_Assertion的参数并处理其中的信息。