我有一个非常奇怪的问题,显示我正在构建的小Yii应用程序的身份验证的开始。我在我的数据库中设置了一个“帐户”表,该表使用与AUTO_INCREMENT id不同的主键设置。
此时,我只是使用此处提供的教程级UserIdentity文件:http://www.yiiframework.com/doc/guide/1.1/en/topics.auth
我正在使用POST从我的表单中获取登录数据,并在必要时在控制器中进行检查。
public function actionLogin()
{
if( isset($_POST["username"]) && isset($_POST["password"]) ){
$identity = new UserIdentity($_POST["username"], $_POST["password"]);
if($identity->authenticate()){
$success = Yii::app()->user->login($identity);
$this->redirect(array('site/index'));
} else {
echo print_r($identity->errorMessage);
}
}
$this->render('login');
}
authenticate()在输入正确的凭据时返回true,而当我在字段中放入废话时则返回false,就像它应该的那样。验证后,它会重定向到索引/主页。
现在,这是没有意义的部分:在索引页面中,我通过转储getId()方法(我已经覆盖)来检查用户的状态,以及检查状态变量我已经设定。另外,当我
echo Yii::app()->user->isGuest;
到屏幕,它返回 false 。哇,太棒了 - 登录应该是成功的。错了。
当我转储应用的用户属性时,
print_r(Yii::app()->user);
它显示CWebUser为空并作为访客。这让我疯了。
CWebUser Object (
[allowAutoLogin] => 1
[guestName] => Guest
[loginUrl] => Array (
[0] => /site/login )
[identityCookie] =>
[authTimeout] =>
[autoRenewCookie] =>
[autoUpdateFlash] => 1
[loginRequiredAjaxResponse] =>
[_keyPrefix:CWebUser:private] => ccd216fa11757a8e75e940c97a24ee44
[_access:CWebUser:private] => Array ( )
[behaviors] => Array ( )
[_initialized:CApplicationComponent:private] => 1
[_e:CComponent:private] =>
[_m:CComponent:private] => )
有什么见解?我的配置是否存在问题或者我可能错过了什么?
编辑:UserIdentity类
class UserIdentity extends CUserIdentity
{ private $ _id;
public function authenticate(){
$record = Account::model()->findByAttributes(array('username'=>$this->username));
if($record === NULL){
$this->errorCode = self::ERROR_USERNAME_INVALID;
} else if($record->password !== crypt($this->password, $record->password)){
$this->errorCode = self::ERROR_PASSWORD_INVALID;
} else {
$this->_id = $record->id;
$this->setState('username', $this->username);
$this->setState('friend_code', $record->friend_code);
$this->errorCode = self::ERROR_NONE;
}
return !$this->errorCode;
}
public function getId(){
return $this->_id;
}
编辑:我已经检查过其他一些事情,并更新了我的UserIdentity类。我现在也可以从Yii :: app() - > user-> id或Yii :: app() - > getId()获得$ _id。
我发现Yii :: app() - > user-> identityCookie不存在,我在浏览器资源中看不到PHPSESHID以外的任何其他Cookie。这是正常的吗?
编辑编辑:在看到第一个答案之后,我决定深入研究一下CWebUser类。看起来这可能不起作用的唯一一块就是这一行。$this->changeIdentity($id,$identity->getName(),$states);
// what this method actually looks like:
protected function changeIdentity($id,$name,$states)
{
Yii::app()->getSession()->regenerateID(true);
$this->setId($id);
$this->setName($name);
$this->loadIdentityStates($states);
}
答案 0 :(得分:0)
我想我发现了这个问题。请查看CWebUser中的以下代码:
public function getIsGuest()
{
return $this->getState('__id')===null;
}
它从您的UserIdentity中检索$id
- 属性并绕过getId()
- 方法。
要解决此问题,您应该使用$_friend_code
- 属性进行报废,仅使用$this->id
,或者在第二个其他块中的authenticate()
- 方法中添加以下行
// some code before this
else {
$this->_friend_code = $record->friend_code;
$this->id = $record->friend_code;
$this->setState('username', $this->username);
$this->setState('test', "test");
$this->errorCode = self::ERROR_NONE;
}
我推荐第一个选择,因为它往往是正常的做事方式。但是由你来决定。
希望这有帮助!
编辑:另一种选择是覆盖CWebUser中的getIsGuest()
- 方法。