Zend Auth有两个标识列

时间:2010-02-16 21:43:12

标签: php zend-framework zend-auth

我正在使用Zend_Auth验证用户凭据并遇到问题。我需要一个双列标识。这两列是用户名和客户标识符。 identityColumn设置和setIdentity()方法不允许此方案。我尝试使用credentialTreatment设置来完成此操作,但是当我有两个或更多客户的重复用户名时,它只会将zend_auth_credential_match计算为其他客户的假,而不是将这些用户过滤掉

这是由Zend Auth执行的结果查询的已清理的示例:

SELECT `users`.*,
    (CASE
        WHEN `password` = 'password'
            AND active = 1
            AND customer_id = 1
            THEN 1 
        ELSE 0
        END) AS `zend_auth_credential_match`
FROM `users`
WHERE (`username` = 'username')

是否有必要扩展Zend_Auth模块来执行此操作?有没有其他人做过,可以提供一个例子?

谢谢!

2 个答案:

答案 0 :(得分:5)

我想你需要编写自己的Zend_Auth_Adapter_DbTable子类来处理这个问题。

类似的东西:

class My_Auth_Adapter extends Zend_Auth_Adapter_DbTable {
  protected $_customerColumn = 'customer_id';
  protected $_customerId = false;

  public function setCustomerId($id) {
    $this->_customerId = $id;
    return $this;
  }

  public function getCustomerId() {
    return $this->_customerId!==false?$this->_customerId:'';
  }

  public function _authenticateCreateSelect() {
    $select = parent::_authenticateCreateSelect();
    $select->where($this->_zendDb->quoteIdentifier($this->_customerColumn, true)." = ?", $this->getCustomerId());
    return $select;
  }
}

答案 1 :(得分:3)

最好的方法是编写自己的Auth适配器。甚至可能直接扩展Zend_Auth_Adapter_DbTable。