YII ::应用程序() - >用户>编号;返回用户名而不是id号

时间:2011-05-27 11:26:37

标签: php yii

我有一个非常奇怪的问题,在一台机器Yii::app()->user->id;上返回用户名,但在运行相同代码的另一台机器上,我按预期获得了ID号。 Yii::app()->user->id如何获取用户名?我错过了什么?

7 个答案:

答案 0 :(得分:5)

首先,让我们来看看用户登录后发生的事情。

之后

    $identity->authenticate();

如果

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

然后我们将进行登录操作

    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;

这意味着要运行扩展CWebUser的类的getId()方法,并在站点(应用程序的根目录)/protected/config/main.php中进行配置,如下所示:

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

就我而言,该类扩展了CWebUser是WebUser。

在WebUser中,没有getId()方法,该方法将继承自CWebUser,因为WebUser是从CWebUser扩展而来的。所以这是来自CWebUser的getId()方法。

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();

所以我们只能在$ idenity中添加一个getId函数,这意味着我们添加了getId函数 扩展CUserIdentity的UserIdentity,如下所示:

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

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

当用户成功登录时,我们可以将user_id传递给UserIdentity的authenticate函数中的setId($ id),该函数扩展了CUserIdentity,如下所示:     public function 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;
}

答案 1 :(得分:3)

您必须覆盖getId()课程中的方法UserIdentity

在您的身份类中,只需添加以下内容:

private $_id;

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

然后最后你可以使用

设置id
$this->_id = $user->id

更多信息,请参阅此链接: http://www.yiiframework.com/doc/guide/1.1/en/topics.auth#defining-identity-class

答案 2 :(得分:1)

试试这个,设置用户名:

$this->_id=$user->id;
$this->username=$user->username;

答案 3 :(得分:0)

你有两种方法可以解决这个问题:

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

两种方式都使用$ _SESSION来保存值。

然后你可以像这样重新评估价值:

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

答案 4 :(得分:0)

试试这个Yii::app()->user->getId()

答案 5 :(得分:0)

即使我遇到了同样的问题,一切都还可以,但我知道用户名是id。 您检查您的Useridentity文件。 在else部分,你可能会错过像指针( - >)这样的东西。

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

希望它可以帮助你.H /

答案 6 :(得分:-1)

yii默认安装将用户ID设置为用户名(默认为admin或demo)。 如果您更改用户脚本并使用sql并对其进行建议的修改,则id将作为表中的id字段返回。