2009-12-22 99 views
0

所以我使用Zend_Auth来验证我的网站的用户。目前他们只能登录他们的电子邮件作为登录,但我想让他们也登录与他们的用户名。Zend_Auth - 能够使用电子邮件和用户名登录

下面是一些代码:

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

通知行:

 $adapter->setIdentityColumn('email'); 

我怎样才能加也有用户名(在名为username的数据库列,太)?

UPDATE:

这是我如何解决了这个:

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

回答

5

我处理同样的事情,我以前Zend_Auth的处理它。我使用单一用户登录字段,首先检查它是否是电子邮件地址 - 如果是,则将其转换为适当的用户名。然后,让Zend_Auth做它的事情。

这对我来说很好,虽然你需要有点切换它,因为你走向另一条路。


i。过滤器添加到您的用户登录场,就像这样:

$user_field->addFilter('EmailToUsername'); 


II。过滤器:

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


至于只是改变Zend_Auth设置代替,Zend_Auth不喜欢要么/或标识列,所以你必须编写自己的身份验证适配器。

+0

我已经通过在控制器中使用电子邮件地址验证程序来解决此问题,而不是在表单中。看看我更新的帖子。我不喜欢创建自定义过滤器等,这也适用。 –

3

自己的解决方案:

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

快速和简单!

相关问题