Zend_Auth链接适配器和所有权角色acl

时间:2011-09-08 09:59:34

标签: php zend-framework zend-auth zend-acl

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

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

我的担忧:

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

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

1 个答案:

答案 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。