问题描述
|
我有一个非常奇怪的问题,在一台计算机上,“ 0”会返回用户名,但是在另一台运行相同代码的计算机上,我正在按预期获取ID号。
Yii::app()->user->id
如何获取用户名?我错过了什么?
解决方法
首先,让我们来看看用户登录后发生了什么。
后
$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()方法,并在sites(应用程序的根目录)/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,$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;
}
当用户成功登录后,我们可以在扩展CUserIdentity的UserIdentity的authenticate函数中将user_id传递给setId($ id),如下所示:
公共功能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;
}
, 您必须在UserIdentity
类中重写方法getId()
。
在您的标识类中,只需添加以下内容:
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
, 试试这个,设置用户名:
$this->_id=$user->id;
$this->username=$user->username;
, 您有两种方法可以解决此问题:
1) Yii::app()->user->setState(\"id\",$user->id);
2) Yii::app()->user->id = $user->id;
两种方法都使用$ _SESSION来保存值。
那么您可以像这样检索值:
Yii::app()->user->id;
, 试试这个Yii::app()->user->getId()
, 即使我遇到了同样的问题,一切都还好,但是我获得了用户名。
您检查您的Useridentity文件。
在其他部分,您可能会错过指针(->)之类的东西。
{
$this->_id = $user->id; /*here u might miss pointer -> */
// print_r($this->_id);exit;
$this->errorCode = self::ERROR_NONE;
}
希望它能对您有所帮助。
, yii默认安装将用户ID设置为用户名(默认为admin或demo)。
如果更改用户脚本并使用sql并对其进行建议的修改,则id作为表中的id字段返回。