Yii после успешного входа Yii::app()-›user-›id дает пустой результат и UserIdentity.email undefined

Yii после успешного входа в систему Yii::app()->user->id дает пустой результат, а свойство «UserIdentity.email» не определено сообщение, когда я печатаю $this->email в функции аутентификации UserIdentity, но электронная почта через форму входа доступна в $this->username Вот моя функция контроллера

public function actionLogin() {
    $model = new LoginForm();
    if (isset($_POST['ajax']) && $_POST['ajax'] === 'login-form') {
        echo CActiveForm::validate($model);
        Yii::app()->end();
    }
    if (isset($_POST['LoginForm'])) {
        $model->attributes = $_POST['LoginForm'];
        if ($model->validate() && $model->login()) {
            echo 'success';
            exit;
        } else {
            echo 'failure';
            exit;
        }
    }
    $this->render('login', array('model' => $model));
}

Вот мой просмотренный файл

 <?php
            $form = $this->beginWidget('CActiveForm', array(
                'id' => 'login-form',
                'enableAjaxValidation' => true,
                'enableClientValidation' => true,
                'clientOptions' => array(
                    'validateOnSubmit' => true,
                ),
                'htmlOptions' => array(
                    'id' => 'form-contact'
                ),
            ));
            echo CHtml::errorSummary($model);
            ?>

            <div id="form-left">
                <label for="text-email">Email(<span style="color: red;">*</span>)</label><br />
                <?php echo $form->textField($model, 'email', array('class' => 'input')); ?><br />
                <label for="text-password">Password (<span style="color: red;">*</span>)</label><br />
                <?php echo $form->passwordField($model, 'password', array('class' => 'input')); ?><br />
                <br>
                <?php echo CHtml::submitButton('Login', array('class' => 'button', 'style' => 'margin-bottom:50px;')); ?>
            </div>
            <?php $this->endWidget(); ?>

Вот код формы входа

<?php

class LoginForm extends CFormModel {

public $email;
public $password;
private $_identity;

public function rules() {
    return array(
        array('password, email', 'required'),
        array('password', 'authenticate'),
    );
}

public function attributeLabels() {
    return array(
        'email' => Yii::t('labels', 'e-mail'),
        'password' => Yii::t('labels', 'Password'),
    );
}



public function authenticate($attribute,$params)
{
    if(!$this->hasErrors())  // we only want to authenticate when no input errors
    {
        $identity=new UserIdentity($this->email,$this->password);
        $identity->authenticate();
        switch($identity->errorCode)
        {
            case UserIdentity::ERROR_NONE:
                Yii::app()->user->login($identity);
                break;
            case UserIdentity::ERROR_USERNAME_INVALID:
                $this->addError('email','Email address is incorrect.');
                break;
            default: // UserIdentity::ERROR_PASSWORD_INVALID
                $this->addError('password','Password is incorrect.');
                break;
        }
    }
}

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)
        return true;
    else
        return false;
}
}

А ВОТ МОЙ КЛАСС ИДЕНТИФИКАЦИИ ПОЛЬЗОВАТЕЛЯ

<?php

class UserIdentity extends CUserIdentity {

private $_id;

public function authenticate() {
    $user = User::model()->findByAttributes(array(
        'email' => $this->username,
    ));
    if ($user === null) { // No user found!
        $this->errorCode = self::ERROR_USERNAME_INVALID;
    } else if ($user->password !== md5($this->password)) {
        $this->errorCode = self::ERROR_PASSWORD_INVALID;
    } else {
        $this->errorCode = self::ERROR_NONE;
        $this->setState('userid', $user->id);
        $this->_id = $user->id;
    }
    return !$this->errorCode;
}

public function getId() {
    return $this->_id;
}

}

person FahadAkram    schedule 25.05.2015    source источник


Ответы (1)


Проблема в $this->setState('userid', $user->id) в вашем классе userIdentity. Это должно быть преобразовано в $this->setState('id', $user->id). А для доступа к электронной почте пользователя необходимо добавить $this->setState('email', $user->username). Итак, ваш класс UserIdentity должен быть таким:

class UserIdentity extends CUserIdentity {

    private $_id;

    public function authenticate() {
         $user = User::model()->findByAttributes(array(
         'email' => $this->username,
         ));
         if ($user === null) { // No user found!
            $this->errorCode = self::ERROR_USERNAME_INVALID;
         } 
         else if ($user->password !== md5($this->password)) {
            $this->errorCode = self::ERROR_PASSWORD_INVALID;
         } 
         else {
            $this->errorCode = self::ERROR_NONE;
            $this->setState('id', $user->id);
            $this->setState('email', $user->username);
            $this->_id = $user->id;
         }
         return !$this->errorCode;
    }

    public function getId() {
         return $this->_id;
    }

}
person hamed    schedule 25.05.2015
comment
спасибо за помощь, я внес изменения в свой UserIdentity, как вы упомянули, и указал Yii::app()-›user-›id, но он все еще пуст. - person FahadAkram; 25.05.2015
comment
Привет, @hamed, после изменения функции аутентификации в LoginForm я могу получить Yii::app()-›user-›id, у меня есть вопрос по редактированию и добавлен новый метод аутентификации в LoginForm Пожалуйста, посмотрите - person FahadAkram; 25.05.2015