Yii :: app () -> user-> isGuest всегда возвращает true, даже если вход был успешным - PullRequest
10 голосов
/ 02 июня 2011

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

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);
}?>

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

EDIT

@briiC.lv Эй .. извините за поздний ответ, я надеюсь, что вы все еще следите за этим! Я не расширяю данный класс 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 
)

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

Ответы [ 8 ]

7 голосов
/ 02 июня 2011

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

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,
    ),
...
4 голосов
/ 27 ноября 2012

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

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

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

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

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

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

1 голос
/ 03 января 2013

Я столкнулся с той же проблемой и обнаружил, что только одна строка в компоненте 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;
}
1 голос
/ 20 ноября 2012

при вызове функции authenticate войдите в систему как

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

и получите идентификатор как

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

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

0 голосов
/ 09 февраля 2016

в PHP.INI => session.use_only_cookies = 0

0 голосов
/ 09 марта 2015

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

0 голосов
/ 26 ноября 2012

Пожалуйста, попробуйте следующий код. Работает хорошо

//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);
    }
}
0 голосов
/ 23 ноября 2012

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

На основе ветки мастера 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's ID that'll be fetch by CWebUser
    ...
}

}

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

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

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