我设置了Zend_Acl和Zend_Auth方案,其中用户使用Zend_Auth_Adapter_Ldap进行身份验证并存储在会话中。我使用控制器插件检查$auth->hasIdentity()
和$acl->isAllowed()
是否需要显示登录表单。
除了Zend_Auth中的会话检查之外,我想要做的是添加登录cookie(我的best practices实现)和API密钥。我还需要在用户创建的内容上将角色切换为“所有者”。
我的担忧:
使用Zend Framework MVC和Zend_Auth + Zend_Acl来解决这个问题的好方法/方法是什么?
答案 0 :(得分:0)
您可以创建自己的适配器/存储类,实现Zend_Auth_Adpater_Interface和Zend_Auth_Storage_Interface
在这些类中,您可以重用原始适配器(如LDAP)或存储,并只编写实现auth规则的代码。
例如,使用Zend_Auth_Adapter的多个源:
<?php
class My_Auth_Adapter implements Zend_Auth_Adapter_Interface
{
private $ldapAdapter;
private $cookieAdapter;
private $apiKeyAdapter;
public function __construct($ldapAdapter, $cookieAdapter, $apiKeyAdapter) {
{
$this->ldapAdapter = $ldapAdapter;
$this->cookieAdapter = $cookieAdapter;
$this->apyKeyAdapter = $apiKeyAdapter;
}
public function authenticate()
{
if ($this->ldapAdapter->authenticate()) {
//return the Zend_Auth_Restult
} elseif ($this->cookieAdapter->authenticate() {
//return the result
} elseif ($this->apiKeyAdapter->authenticate() {
//return the result
} else {
//Create and return a Zend_Auth_Result which prevents logging in
}
}
}
我不确定您的登录规则,但存储类的概念保持不变:
<?php
class My_Auth_Storage implements Zend_Auth_Storage_Interface
private $sessionStorage;
private $cookieStorage;
private $apiStorage;
public function read()
{
if (!$this->sessionStorage->isEmpty())
{
return $this->sessionStorage->read();
} elseif (!$this->cookieStorage->isEmpty())
{
return $this->cookieStorage->read();
} //And so one, do not forget to implement all the interface's methods
通过此实现,您可以拥有多个凭据源和多个会话存储引擎(cookie,会话,数据库或您想要使用的任何内容)。
对于您的acl问题,您可以在您的控制器插件中获取LDAP组,并在身份验证后将其存储在您需要的任何位置。然后,您可以使用第二个插件检查每个请求的ACL。