2009-12-09 4 views
5

В настоящее время я получаю очередную DbTable Auth Adapter:Zend Framework: как проверить дополнительный столбец при использовании адаптера DbTable Auth?

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, например). Я не знаю, можно ли это сделать с адаптером. Как это может быть сделано?

ответ

0

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

protected function _authenticateCreateSelect() 

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

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

+0

Я действительно не понимаю этого ... Не могли бы вы рассказать о своем ответе? В частности, по порядку параметров и тому, как он работает. – Andrew

+0

Он не проверяет другой столбец, но сочетает его с паролем и делает хэш на этом. Я думаю, что в настоящее время нет способа проверить дополнительное поле, например valid = 1 или что-то :( – Chris

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; 
} 
+0

В Zend 3 class 'Zend_Auth_Adapter_DbTable 'изменяется на' Zend \ Authentication \ Adapter \ DbTable \ CredentialTreatmentAdapter'. Класс 'DbTable', насколько я могу видеть, устарел. – ptyskju

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');