Zend Framework: как проверить дополнительный столбец при использовании DbTable Auth Adapter?

В настоящее время я получаю регулярный 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 ответа

У меня похожая ситуация, и я продлил 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;
}

Я использую два столбца для моего 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и для меня это работает хорошо. Я не знаю, поможет ли это вам, поскольку я не знаю, что вы пытаетесь сделать.

Я знаю, что этот вопрос уже может быть решен, но вы также можете решить его без необходимости расширять класс, использовать метод 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');

Включенный адаптер Auth Zend_Auth_Adapter_DbTable не позволяет проверять дополнительный столбец. Вы можете расширить класс Zend_Auth_Adapter_DbTable и добавить еще один столбец. Вам нужно будет добавить переменную-член для значения нового поля $_otherFieldValue и публичную функцию setMemberField($value). Наконец, вам придется переопределить:

protected function _authenticateCreateSelect()

Надеюсь, это поможет.

Другие вопросы по тегам