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()
Надеюсь, это поможет.