2009-12-22 2 views
0

J'utilise donc Zend_Auth pour authentifier les utilisateurs de mon site Web. Actuellement, ils ne peuvent se connecter qu'avec leur adresse électronique, mais je voudrais leur permettre de se connecter avec leur nom d'utilisateur.Zend_Auth - Être capable de se connecter avec un courriel et un nom d'utilisateur

Voici un code:

 // prepare adapter for Zend_Auth 
     $adapter = new Zend_Auth_Adapter_DbTable($this->_getDb()); 
     $adapter->setTableName('users'); 
     $adapter->setIdentityColumn('email'); 
     $adapter->setCredentialColumn('password_hash'); 
     $adapter->setCredentialTreatment('CONCAT(SUBSTRING(password_hash, 1, 40), SHA1(CONCAT(SUBSTRING(password_hash, 1, 40), ?)))'); 
     $adapter->setIdentity($request->getParam('email')); 
     $adapter->setCredential($request->getParam('password')); 

Avis de la ligne:

 $adapter->setIdentityColumn('email'); 

Comment puis-je ajouter nom d'utilisateur également là (colonne dans la base de données appelée nom d'utilisateur, aussi)?

MISE À JOUR:

Voilà comment je résolu ce problème:

 $login = $request->getParam('email'); 
     $validator = new Zend_Validate_EmailAddress(); 
     if (false === $validator->isValid($login)) { 
      $u = $this->_getTable('Users')->getSingleWithUsername($login); 
      if (null === $u) { 
       throw new Exception ('Invalid login and/or password'); 
      } 
      $login = $u->email; 
     } 

     // prepare adapter for Zend_Auth 
     $adapter = new Zend_Auth_Adapter_DbTable($this->_getDb()); 
     $adapter->setTableName('users'); 
     $adapter->setIdentityColumn('email'); 
     $adapter->setCredentialColumn('password_hash'); 
     $adapter->setCredentialTreatment('CONCAT(SUBSTRING(password_hash, 1, 40), SHA1(CONCAT(SUBSTRING(password_hash, 1, 40), ?)))'); 
     $adapter->setIdentity($login); 
     $adapter->setCredential($request->getParam('password')); 

Répondre

5

Je traite avec la même chose, et je manipule avant Zend_Auth. J'utilise un champ de connexion d'utilisateur unique et vérifie d'abord s'il s'agit d'une adresse e-mail. Dans ce cas, il est converti en nom d'utilisateur approprié. Ensuite, laissez Zend_Auth faire son truc.

Cela fonctionne bien pour moi, bien que vous ayez besoin de le changer un peu autour de, puisque vous allez dans l'autre sens.


i. Ajouter un filtre à votre champ, de connexion utilisateur comme ceci:

$user_field->addFilter('EmailToUsername'); 


ii. Le filtre:

<?php 

/** 
* Converts an email address to the username. 
*/ 
class Prontiso_Filter_EmailToUsername implements Zend_Filter_Interface 
{ 
    public function filter($value) 
    { 
    if (Zend_Validate::is($value, 'EmailAddress')) { 

     $user_table = new Users(); 
     $user = $user_table->findByEmail($value); 
     if ($user) { 
     return $user->username; 
     } 
    } 

    /** 
    * Nothing happened, so don't filter. 
    */ 
    return $value; 
    } 
} 


Quant à changer juste un Zend_Auth réglage à la place, Zend_Auth ne soit pas comme/ou colonnes d'identité, de sorte que vous devriez écrire votre propre adaptateur auth.

+0

Je l'ai résolu en utilisant le validateur d'adresse électronique dans le contrôleur à la place dans le formulaire. Consultez ma publication mise à jour. Je n'aime pas créer des filtres personnalisés et autres et cela fonctionne aussi bien. –

3

Ma solution:

$adapter->setIdentityColumn(stripos($indentity, '@') ? 'email' : 'username'); 

simple et rapide!

Questions connexes