2009-12-09 22 views
5

Actuellement, je reçois un DbTable Auth Adapter régulier:Zend Framework: Comment vérifier une colonne supplémentaire en utilisant 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; 
} 

Mais je veux vérifier une colonne supplémentaire dans la base de données (IsActive par exemple). Je ne sais pas si cela peut être fait avec l'adaptateur. Comment cela peut-il être fait?

Répondre

0

L'Auth Auth Adapater Zend_Auth_Adapter_DbTable ne vous permet pas de cocher une colonne supplémentaire. Vous pouvez étendre la classe Zend_Auth_Adapter_DbTable et ajouter une autre colonne. Vous devrez ajouter une variable membre pour la valeur du nouveau champ $ _otherFieldValue et une fonction publique setMemberField ($ value). Enfin, vous devrez remplacer:

protected function _authenticateCreateSelect() 

Espérons que ça aide.

1

J'utilise deux colonnes pour mon Zend_Auth_Adapter_DbTable, et il ressemble à ceci:

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

Lors de l'authentification, la fin de SQL ressemble à ceci:

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

Alors, qui vérifie une colonne supplémentaire , password_salt, et pour moi cela fonctionne bien. Je ne sais pas si cela vous aide, car je ne sais pas ce que vous essayez de faire.

+0

Je ne comprends pas vraiment cela ... Pouvez-vous développer votre réponse? Spécifiquement sur l'ordre des params et comment ça marche. – Andrew

+0

Il ne vérifie pas une autre colonne mais le combine avec le mot de passe et fait un hachage sur cela .. Je pense qu'il n'y a actuellement aucun moyen de vérifier un champ supplémentaire comme valide = 1 ou quelque chose :( – Chris

2

J'ai une situation similaire, et j'étendu la Zend_Auth_Adapter_DbTable pour satisfaire mes besoins:

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

Je l'utilise alors comme ceci:

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

Dans la classe Zend 3 'Zend_Auth_Adapter_DbTable 'est changé en' Zend \ Authentification \ Adaptateur \ DbTable \ CredentialTreatmentAdapter. 'Classe 'DbTable' aussi loin que je peux voir est dépréciée. – ptyskju

0

Je sais que cette question peut être déjà résolu mais vous pouvez également résoudre ceci sans avoir besoin d'étendre la classe, utilisez la méthode getDbSelect() et ajoutez la clause 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');