Yii:: app() → user-> isGuest всегда возвращает true, даже если логин был успешным

Я начал делать некоторые различия между теми пользователями, которые прошли аутентификацию, и теми, которые не являются. Для этого я использую

Yii::app()->user->id;

Однако в определенном виде я поставлю следующий код:

<?php 
    if(Yii::app()->user->isGuest) {
        print("Welcome back Guest!");
        print("Your id is ".Yii::app()->user->id);
    } else {
        print("Welcome back ".Yii::app()->user->name);
        print("Your id is ".Yii::app()->user->id);
}?>

И я всегда получаю "приветствую гостей!", независимо от того, вошел ли я (успешно) или нет. И если я имеет, то он отображает приветственное сообщение вместе с идентификатором пользователя!

ИЗМЕНИТЬ

@briiC.lv Эй.. извините за поздний ответ, надеюсь, вы все еще следуете этому! Я не расширяю данный класс UserIdentity. Это обязательно? Поскольку я до сих пор не очень хорошо разбираюсь во всей проблеме авторизации, я подумал, что лучше всего попробовать попробовать класс, который они предоставляют, а затем расширить с помощью моей собственной функциональности. В любом случае, после этого я опубликую свой класс UserIdentity с его небольшими настройками. может быть, проблема здесь?

<?php class UserIdentity extends CUserIdentity{
private $_id;

public function authenticate()
{   
    $user = Users::model()->findAll('username=\''.$this->username.'\' AND password=\''.$this->encryptedPassword.'\'');
    if(!isset($user[0]))
    {
        return false;
    }
    else 
    {   
        $this->setState('id', $user[0]->id);            
        $this->username = $user[0]->username;
        $this->errorCode=self::ERROR_NONE;
        return true;
    }
}

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

}

Вот результат, который я получил, когда я начал регистрироваться, как вы предложили; Я получил этот результат сразу после успешного входа в систему.

[05:23:21.833][trace][vardump] CWebUser#1 ( 
[allowAutoLogin] => true 
[guestName] => 'Guest' 
[loginUrl] => array ( '0' => '/site/login' ) 
[identityCookie] => null 
[authTimeout] => null 
[autoRenewCookie] => false 
[autoUpdateFlash] => true 
[CWebUser:_keyPrefix] => '0f4431ceed8f17883650835e575b504b' 
[CWebUser:_access] => array() 
[behaviors] => array() 
[CApplicationComponent:_initialized] => true 
[CComponent:_e] => null 
[CComponent:_m] => null 
)

Любая помощь очень ценится!

Ответ 1

Возможно, вы можете попробовать отлаживать больше: измените сообщения на что-то вроде этого:

if(Yii::app()->user->isGuest) {
    print("Not logged");
} else {
    print_r(Yii::app()->user);
    print("Welcome ".Yii::app()->user->name);
    print("Your id is ".Yii::app()->user->id);

}

И проверьте переменную сеанса в файле config/main.php

...
    'session' => array(
        'autoStart'=>true,
    ),
...

Ответ 2

Ошибка находится в следующей строке

$this->setState('id', $user[0]->id);            

Как видно из официальной документации yii относительно auth и auth, setState следует использовать для чего-либо, кроме поля id. Чтобы реализовать ключ, который Yii будет использовать для идентификации вашего пользователя, верните уникальное значение для каждого пользователя в функции Identity getId().

В вашем случае это означает, что вам просто нужно изменить указанную выше строку следующим образом:

$this->_id = $user[0]->id;

Что касается фактической внутренней работы процедуры входа в систему, я бы рекомендовал посмотреть класс CWebUser и особенно на его функцию входа, который отвечает за фактическое сохранение возвращаемого значения Identity getId().

Ответ 3

когда вы вызываете пользователя входа в функцию аутентификации как

 $userIdentity = new UserIdentity($username, $password);   
        $userIdentity->authenticate();
        if ($userIdentity->errorCode===UserIdentity::ERROR_NONE) {
            Yii::app()->user->login($userIdentity,0);
 }

и введите id как

echo 'id='.Yii::app()->user->getId();

применить этот код и проверить

Ответ 4

Я столкнулся с такой же проблемой и обнаружил, что только одна строка в компоненте UserIdentity решит эту проблему.

Это ваш код:

else 
{   
    $this->setState('id', $user[0]->id);            
    $this->username = $user[0]->username;
    $this->errorCode=self::ERROR_NONE;
    return true;
}

Обновите этот код этим

else 
{
    $this->_id = $user[0]->id;   
    $this->setState('id', $user[0]->id);            
    $this->username = $user[0]->username;
    $this->errorCode=self::ERROR_NONE;
    return true;
}

Ответ 5

Прежде всего, вам нужно знать условие, которое устанавливает гостевой и входной пользователь отдельно.

Основываясь на ветке мастера Yii CWebUser:: getIsGuest():

public function getIsGuest()
{
    return $this->getState('__id')===null;
}

По сравнению с вашим кодом:

$user = Users::model()->findAll('username=\''.$this->username.'\' AND password=\''.$this->encryptedPassword.'\'');
if(!isset($user[0])) {
    // false
} else {   
    $this->setState('id', $user[0]->id); // this is for persistent state sakes
    ...
}

}

Вкратце: вы поставили 'id' в постоянное состояние Identity, но Yii CWebUser ожидал '__id' на основе UserIdentity:: getId().

Решение довольно простое. Вам просто нужно установить $this → _ id

$user = Users::model()->findAll('username=\''.$this->username.'\' AND password=\''.$this->encryptedPassword.'\'');
if(!isset($user[0])) {
    // false
} else {   
    $this->setState('id', $user[0]->id); // this is for persistent state sakes
    $this->_id = $user[0]->id; // this is UserIdentity ID that'll be fetch by CWebUser
    ...
}

}

Эта процедура объясняет, как CWebUser получает идентификатор UserIdentity: https://github.com/yiisoft/yii/blob/master/framework/web/auth/CWebUser.php#L221

Пожалуйста, проверьте это.

Ответ 6

Попробуйте использовать следующий код. Его хорошо работает

//config/main.php
return array (
'component' => array(
    'session' => array(
        'savePath' => INSTANCE_ROOT.DS.'runtime'.DS.'session',
        'autoStart' => true,
        ),
    )
);

// LoginController 
class LoginController extends CController {
    public function actionLogin () {
      if(isset($_POST['LoginForm']))
      {
          $form = new LoginForm;
          $form->setAttributes($_POST['LoginForm']);

          if ($form->validate()) {
                $user = Users::model()->find('upper(username) = :username', array(
                    ':username' => strtoupper($form->username)));

                    if($user)
                        return $this->authenticate($user, $form);
                    else {
                        Yii::log( 'som.....', 'error');
                        $form->addError('password', Yii::t('Username or Password is incorrect'));
                    }
                    return false;
          }
      }
    }

    protected function authenticate($user, $form) {
        $identity = new UserIdentity($user->username, $form->password);
        $identity->authenticate();
        switch($identity->errorCode) {
            case UserIdentity::ERROR_NONE:
                $duration = $form->rememberMe ? 3600*24*30 : 0; // 30 days
                Yii::app()->user->login($identity,$duration);
                return $user;
                break;
            case UserIdentity::ERROR_EMAIL_INVALID:
                $form->addError("password",Yii::t('Username or Password is incorrect'));
                break;
            case UserIdentity::ERROR_STATUS_INACTIVE:
                $form->addError("status",Yii::t('This account is not activated.'));
                break;
            case UserIdentity::ERROR_STATUS_BANNED:
                $form->addError("status",Yii::t('This account is blocked.'));
                break;
            case UserIdentity::ERROR_STATUS_REMOVED:
                $form->addError('status', Yii::t('Your account has been deleted.'));
                break;
            case UserIdentity::ERROR_PASSWORD_INVALID:
                Yii::log( Yii::t(
                            'Password invalid for user {username} (Ip-Address: {ip})', array(
                                '{ip}' => Yii::app()->request->getUserHostAddress(),
                                '{username}' => $form->username)), 'error');
                    if(!$form->hasErrors())
                    $form->addError("password",Yii::t('Username or Password is incorrect'));
                break;
                return false;
        }
    }
}

class UserIdentity extends CUserIdentity {

    const ERROR_EMAIL_INVALID=3;
    const ERROR_STATUS_INACTIVE=4;
    const ERROR_STATUS_BANNED=5;
    const ERROR_STATUS_REMOVED=6;
    const ERROR_STATUS_USER_DOES_NOT_EXIST=7;

    public function authenticate()
    {
        $user = Users::model()->find('username = :username', array(
                    ':username' => $this->username));
        if(!$user)
            return self::ERROR_STATUS_USER_DOES_NOT_EXIST;

        if(Users::encrypt($this->password)!==$user->password)
            $this->errorCode=self::ERROR_PASSWORD_INVALID;
        else if($user->status == YumUser::STATUS_INACTIVE)
            $this->errorCode=self::ERROR_STATUS_INACTIVE;
        else if($user->status == YumUser::STATUS_BANNED)
            $this->errorCode=self::ERROR_STATUS_BANNED;
        else if($user->status == YumUser::STATUS_REMOVED)
            $this->errorCode=self::ERROR_STATUS_REMOVED;

        return !$this->errorCode;
    }
}

class Users extends CActiveModel
{
    const STATUS_INACTIVE = 0;
    const STATUS_ACTIVE = 1;
    const STATUS_BANNED = -1;
    const STATUS_REMOVED = -2;

    // some ..........

    public static function encrypt($string = "")
    {
        $salt = 'salt';
        $string = sprintf("%s%s%s", $salt, $string, $salt);
        return md5($string);
    }
}

Ответ 7

проверьте конфигурацию безопасности для файлов cookie и сеансов. отключить session.use_only_cookies и session.cookie_httponly в php.ini  файл.

Ответ 8

в PHP.INI = > session.use_only_cookies = 0