Zend_Auth - сможете войти как с электронной почтой, так и с именем пользователя - PullRequest
0 голосов
/ 22 декабря 2009

Так что я использую 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'));

Ответы [ 2 ]

5 голосов
/ 22 декабря 2009

Я имею дело с тем же самым, и я обращаюсь с этим до 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 не любит ни столбцы идентификаторов, ни идентификаторы, поэтому вам придется написать собственный адаптер аутентификации.

3 голосов
/ 02 ноября 2012

Мое собственное решение:

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

Быстро и просто!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...