In login form model
/** * LoginForm class. * LoginForm is the data structure for keeping * user login form data. It is used by the 'login' action of 'SiteController'. */ class LoginForm extends CFormModel { public $password; public $rememberMe; public $email; // Email private $_identity; /** * Declares the validation rules. * The rules state that username and password are required, * and password needs to be authenticated. */ public function rules() { return array( // username and password are required array('email, password', 'required'), // rememberMe needs to be a boolean array('rememberMe', 'boolean'), array('email', 'email'), // password needs to be authenticated array('password', 'authenticate'), ); } /** * Declares attribute labels. */ public function attributeLabels() { return array( 'rememberMe'=>'Remember me next time', ); } /** * Authenticates the password. * This is the 'authenticate' validator as declared in rules(). */ public function authenticate($attribute,$params) { if(!$this->hasErrors()) { $this->_identity=new UserIdentity($this->email,$this->password); if(!$this->_identity->authenticate()) $this->addError('password','Incorrect username or password.'); } } /** * Logs in the user using the given username and password in the model. * @return boolean whether login is successful */ public function login() { if($this->_identity===null) { $this->_identity=new UserIdentity($this->email,$this->password); $this->_identity->authenticate(); } if($this->_identity->errorCode===UserIdentity::ERROR_NONE) { $duration=$this->rememberMe ? 3600*24*30 : 0; // 30 days Yii::app()->user->login($this->_identity,$duration); return true; } else return false; } }
And then extends CUserIdentity
/** * 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 { /** * @var string email */ public $email; const ERROR_EMAIL_INVALID=1; /** * @param string $email * @param string $password */ public function __construct($email, $password) { parent::__construct($email, $password); $this->email=$email; } /** * 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() { $users=array( // username => password 'demo@demo.fr'=>'demo', 'admin@admin.fr'=>'admin' ); if(!isset($users[$this->email])) $this->errorCode=self::ERROR_EMAIL_INVALID; elseif($users[$this->email]!==$this->password) $this->errorCode=self::ERROR_PASSWORD_INVALID; else $this->errorCode=self::ERROR_NONE; return !$this->errorCode; } /** * @return mixed */ public function getPassword() { return $this->password; } /** * @return mixed */ public function getEmail() { return $this->email; } }