Yii user-> isGuest返回false,但在打印到屏幕时显示为guest

时间:2014-01-21 21:53:17

标签: php yii

我有一个非常奇怪的问题,显示我正在构建的小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);
}

1 个答案:

答案 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() - 方法。