5

目前,我得到了一个常规DbTable Auth Adapter

protected function _getAuthAdapter($formData)
{       
    $dbAdapter = Zend_Db_Table::getDefaultAdapter();
    $authAdapter = new Zend_Auth_Adapter_DbTable($dbAdapter);
    $authAdapter->setTableName('users')
        ->setIdentityColumn('username')
        ->setCredentialColumn('password');
    $authAdapter->setIdentity($formData['username']);
    $authAdapter->setCredential(md5($formData['password']));
    return $authAdapter;
}

但我想检查数据库中的附加列(IsActive例如)。我不知道这是否可以通过适配器完成。如何才能做到这一点?

4

4 回答 4

2

我有类似的情况,我扩展了Zend_Auth_Adapter_DbTable以满足我的需求:

class My_Auth_Adapter_DbTable extends Zend_Auth_Adapter_DbTable
{
    protected $_customerIdColumn = '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() {
        $dbSelect = parent::_authenticateCreateSelect();
        $dbSelect->where($this->_zendDb->quoteIdentifier($this->_customerIdColumn, true) . ' = ?',
            $this->getCustomerId());
        return $dbSelect;
    }
}

然后我像这样使用它:

public function getAuthAdapter(array $params)
{
    $authAdapter = new My_Auth_Adapter_DbTable(
        $params['db_adapter'],
        'users',
        'username',
        'password',
        '? AND active = 1'
    );

    $authAdapter->setIdentity($params['username'])
        ->setCustomerId($params['customer_id'])
        ->setCredential($params['password']);

    return $authAdapter;
}
于 2010-11-30T21:20:07.740 回答
1

我为 Zend_Auth_Adapter_DbTable 使用了两列,它看起来像这样:

$authAdapter = new Zend_Auth_Adapter_DbTable(
  Zend_Registry::get('database'),
  "user",
  "username",
  "password_hash", // column 1
  "MD5( CONCAT(?,password_salt) )" // column 2
);

进行身份验证时,SQL 最终看起来像这样:

SELECT `user`.*, 
(CASE WHEN `password_hash` = MD5( CONCAT('password entered',password_salt) )
  THEN 1 ELSE 0 END) AS `zend_auth_credential_match`
FROM `user` WHERE (`username` = 'username entered')

所以,这会检查一个额外的列,password_salt,对我来说效果很好。我不知道这是否对您有帮助,因为我不知道您要做什么。

于 2009-12-09T02:49:20.013 回答
0

包含的 Auth Adapater Zend_Auth_Adapter_DbTable 不允许您检查附加列。您可以扩展 Zend_Auth_Adapter_DbTable 类并添加另一列。您必须为新字段 $_otherFieldValue 的值添加一个成员变量和一个公共函数 setMemberField($value)。最后,您必须覆盖:

protected function _authenticateCreateSelect()

希望有帮助。

于 2009-12-09T02:29:38.213 回答
0

我知道这个问题可能已经解决了,但您也可以在不需要扩展类的情况下解决这个问题,使用 getDbSelect() 方法并向其中添加 where 子句:

    $authAdapter = new Zend_Auth_Adapter_DbTable(Model_Users::getDefaultAdapter());

    $authAdapter->setTableName('users');
    $authAdapter->setIdentityColumn('email');
    $authAdapter->setCredentialColumn('password')->setCredentialTreatment('md5(?)');
    $authAdapter->setIdentity($email);
    $authAdapter->setCredential($password);
    $authAdapter->getDbSelect()->where('active = 1');
于 2015-02-03T12:19:41.607 回答