Yii :: приложение () -> user-> идентификатор; возвращает имя пользователя вместо идентификатора - PullRequest
5 голосов
/ 27 мая 2011

У меня очень странная проблема в том, что на одной машине Yii::app()->user->id; возвращает имя пользователя, но на другой машине с идентичным кодом я получаю номер идентификатора, как и ожидалось.Как Yii::app()->user->id может получить имя пользователя?Что я пропустил?

Ответы [ 7 ]

5 голосов
/ 05 июля 2013

сначала, давайте посмотрим, что произошло после входа пользователя в систему.

после

    $identity->authenticate();

если

    $identity->errorCode===UserIdentity::ERROR_NONE

, тогда мы перейдем к логинуaction

    Yii::app()->user->login($identity,$duration)

и что за логином?

Я просканировал источник yii. Основная идея -

    $this->changeIdentity($id,$identity->getName(),$states);

в функции входа в класс CWebUser.

ниже приведена функция changeIdentity

    protected function changeIdentity($id,$name,$states)
{ 
    Yii::app()->getSession()->regenerateID(true);
    $this->setId($id);
    $this->setName($name);
    $this->loadIdentityStates($states);
}

во-вторых: давайте оглянемся назад на проблему

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

Это означает запуск метода getId () вашего класса, который расширяет CWebUserи вы настраиваете его на сайтах (в корне вашего приложения) /protected/config/main.php следующим образом:

    'components'=>array(
    'user'=>array(
        'class'=>'WebUser',
        // enable cookie-based authentication
        'allowAutoLogin'=>true,
    ),

В моем случае класс расширяет CWebUser - WebUser.

В WebUser нет метода getId (), метод будет унаследован от CWebUser, поскольку WebUser расширяется от CWebUser.так что это метод getId () из CWebUser.

https://github.com/yiisoft/yii/blob/1.1.13/framework/web/auth/CWebUser.php#LC287

     public function getId()
{
    return $this->getState('__id');
}

так когда же устанавливается __id?очевидно, это установлено в операторе changeIdentity:

    $this->setId($id);

и откуда берется аргумент $ id?мы знаем его по коду ниже в классе CWebUser:

    public function login($identity,$duration=0)
{ 
    $id=$identity->getId();


    $states=$identity->getPersistentStates();



    if($this->beforeLogin($id,$states,false))
    {
        $this->changeIdentity($id,$identity->getName(),$states);

        if($duration>0)
        {
            if($this->allowAutoLogin)
                $this->saveToCookie($duration);
            else
                throw new CException(Yii::t('yii','{class}.allowAutoLogin must be set true in order to use cookie-based authentication.',
                    array('{class}'=>get_class($this))));
        }

        $this->afterLogin(false);
    }
    return !$this->getIsGuest();
}

    $id = $identity->getId();

, поэтому мы можем добавить только функцию getId в $ idenity, это означает, что мы добавляем функцию getId в UserIdentity, котораярасширить CUserIdentity, например:

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

и

public function setId($id)
{
    $this->_id = $id;
    return;
}

при успешном входе пользователя в систему, мы можем передать user_id в setId ($ id) в функции аутентификации UserIdentity, которая расширяет CUserIdentity,как это: публичная функция authenticate () {

    $record=User::model()->findByAttributes(array('user_name'=>$this->username));

    if($record===null)
        $this->errorCode=self::ERROR_USERNAME_INVALID;
    else if($record->password!==md5($this->password))
        $this->errorCode=self::ERROR_PASSWORD_INVALID;
    else
    {
        $this->setId($record->user_id);


        $this->errorCode=self::ERROR_NONE;
    }
    return !$this->errorCode;
}
3 голосов
/ 07 февраля 2013

Вы должны переопределить метод getId() в вашем UserIdentity классе.

В вашем классе идентификации просто добавьте это:

private $_id;

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

и, наконец, вы можете установить идентификатор с помощью

$this->_id = $user->id

Подробнее об этом, пожалуйста, обратитесь по этой ссылке: http://www.yiiframework.com/doc/guide/1.1/en/topics.auth#defining-identity-class

1 голос
/ 27 мая 2011

Попробуйте, установите имя пользователя:

$this->_id=$user->id;
$this->username=$user->username;
0 голосов
/ 05 декабря 2016

Даже у меня та же проблема, все в порядке, но, скорее всего, я получил имя пользователя. Вы проверяете свой файл Useridentity. В другой части вы можете пропустить что-то вроде указателя (->).

    {
        $this->_id = $user->id; /*here u might miss pointer -> */
        // print_r($this->_id);exit;
        $this->errorCode = self::ERROR_NONE;
    }

Надеюсь, это поможет тебе.

0 голосов
/ 08 июля 2014

попробуйте Yii::app()->user->getId()

0 голосов
/ 31 мая 2011

у вас есть два способа решить эту проблему:

1) Yii::app()->user->setState("id",$user->id);
2) Yii::app()->user->id = $user->id;

в обоих направлениях используется $ _SESSION для сохранения значения.

тогда вы можете повторить значение так:

Yii::app()->user->id;
0 голосов
/ 28 мая 2011

yii Установка по умолчанию устанавливает идентификатор пользователя в качестве имени пользователя (по умолчанию admin или demo). Если вы измените пользовательский сценарий и используете sql и сделаете для этого рекомендуемые изменения, id возвращается в виде поля id в таблице.

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