Расширяемость Cuseridentity.

Всем привет. Yii начал изучать относительно недавно.

Стандартный CUserIdentity использует поля по умолчанию username и password, и получается, что если от него наследоваться, то всегда будут висеть эти два поля.

А я вот решил сделать EmailIdentity, который будет сверять по email и password, понимаю, что вместо email можно использовать поле username, но если я хочу чтобы было именно email?

Если просто добавить в новый класс (который наследует CUserIdentity) поле $email, то авторизация не будет работать, пока я не перегружу метод getId() { return $this->email; }. Так в чем плюс наследования CUserIdentity? Когда я могу сразу наследоваться от CBaseUserIdentity и там указать нужные мне поля?

Может у CUserIdentity и нет плюсов, если вам так уж обязательно, что бы поле логина называлось "email" а не "username".

Но IMHO выглядит такое стремление к переименованию не стоящим усилий. Могу ошибаться.

Не знаю, у меня работает. А если вам надо будет чтобы можно было логинится и по username и email, так как у меня например. Вот UserIdentity если интересно:




<?php


/**

 * UserIdentity represents the data needed to identity a user.

 * It contains the authentication method that checks if the provided

 * data can identity the user.

 */

class UserIdentity extends CUserIdentity

{

	private $_id;

	const ERROR_EMAIL_INVALID=3;

	const ERROR_STATUS_NOTACTIV=4;

	const ERROR_STATUS_BAN=5;

	/**

	 * Authenticates a user.

	 * The example implementation makes sure if the username and password

	 * are both 'demo'.

	 * In practical applications, this should be changed to authenticate

	 * against some persistent user identity storage (e.g. database).

	 * @return boolean whether authentication succeeds.

	 */

	public function authenticate()

	{

		if (strpos($this->username,"@")) {

			$user=User::model()->notsafe()->findByAttributes(array('email'=>$this->username));

		} else {

			$user=User::model()->notsafe()->findByAttributes(array('username'=>$this->username));

		}

		if($user===null)

			if (strpos($this->username,"@")) {

				$this->errorCode=self::ERROR_EMAIL_INVALID;

			} else {

				$this->errorCode=self::ERROR_USERNAME_INVALID;

			}

		else if(Yii::app()->getModule('user')->encrypting($this->password)!==$user->password)

			$this->errorCode=self::ERROR_PASSWORD_INVALID;

		else if($user->status==0&&Yii::app()->getModule('user')->loginNotActiv==false)

			$this->errorCode=self::ERROR_STATUS_NOTACTIV;

		else if($user->status==-1)

			$this->errorCode=self::ERROR_STATUS_BAN;

		else {

			$this->_id=$user->id;

			$this->username=$user->email;

			$this->errorCode=self::ERROR_NONE;

		}

		return !$this->errorCode;

	}


    /**

    * @return integer the ID of the user record

    */

	public function getId()

	{

		return $this->_id;

	}

}



Спасибо за ответы и пример.

Решил все-таки использовать username в качестве поля для email, мне просто было интересно.