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

Ric*_*nop 0 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'));
Run Code Online (Sandbox Code Playgroud)

注意这一行:

        $adapter->setIdentityColumn('email');
Run Code Online (Sandbox Code Playgroud)

如何在那里添加用户名(数据库中名为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'));
Run Code Online (Sandbox Code Playgroud)

Der*_*huk 5

我处理同样的事情,我在Zend_Auth之前处理它.我使用单个用户登录字段,首先检查它是否是电子邮件地址 - 如果是,则转换为相应的用户名.然后,让Zend_Auth做自己的事.

这对我很有用,虽然你需要切换它,因为你会走另一条路.


一世.在您的用户登录字段中添加过滤器,如下所示:

$user_field->addFilter('EmailToUsername');
Run Code Online (Sandbox Code Playgroud)


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;
  }
}
Run Code Online (Sandbox Code Playgroud)


至于改变Zend_Auth设置,Zend_Auth不喜欢任何一个/或标识列,所以你必须编写自己的auth适配器.