0

我设置了 Zend_Acl 和 Zend_Auth 方案,其中用户使用 Zend_Auth_Adapter_Ldap 进行身份验证并存储在会话中。我使用控制器插件来检查是否$auth->hasIdentity()$acl->isAllowed()在需要时显示登录表单。

除了 Zend_Auth 中的会话检查之外,我想要做的是添加登录 cookie(我的最佳实践实现)和 API 密钥。我还需要在用户创建的内容上将角色切换为“所有者”。

我的担忧:

  • 仅当常规会话身份验证失败时,登录 cookie 才应用作后备,因此应对会话进行身份验证
  • 如果登录 cookie 和会话 cookie 都失败,则应使用 API 密钥作为后备
  • 我不想将密码存储在任何地方,它应该只驻留在 LDAP 中
  • 我需要永久存储身份,因为如果没有完整的用户名和密码,就无法在 LDAP 中查找它
  • 该角色既取决于 LDAP 组成员身份(需要永久存储),也取决于身份是否应被视为内容的所有者(意味着它在请求之间发生变化,除非管理员)

使用 Zend Framework MVC 和 Zend_Auth + Zend_Acl 解决这个问题的好模式/方法是什么?

4

1 回答 1

0

您可以创建自己的适配器/存储类,实现 Zend_Auth_Adpater_Interface 和 Zend_Auth_Storage_Interface

在这些类中,您可以重用原始适配器(如 LDAP)或存储,并且只编写实现您的身份验证规则的代码。

例如,为 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
          }
     }
}

我不确定是否理解您的登录规则,但 Storage 类的概念仍然相同:

 <?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。

于 2011-09-11T09:30:08.337 回答