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