Zend_Auth - 能够使用电子邮件和用户名登录

时间:2009-12-22 17:41:44

标签: zend-framework

所以我使用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的列)?

更新:

这就是我解决这个问题的方法:

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

2 个答案:

答案 0 :(得分: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不喜欢任何/或标识列,因此您必须编写自己的身份验证适配器。

答案 1 :(得分:3)

我自己的解决方案:

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

快速而简单!