2

我开始在经过身份验证的用户和来宾用户之间创建差异。但总是当我识别用户并成功登录时,当我使用 Yii::app()->user->isGuest 时它仍然返回 true。这是我正在使用的代码:

if (Yii::app()->user->isGuest){
            echo 'Welcome back Guest';
    } else {
            echo 'Welcome back '.Yii::app()->user->name;
    }

无论我是否(成功)登录,我总是得到“欢迎回来的客人”。如果我再次登录,我会收到此消息。这是用户识别代码。

class UserIdentity extends CUserIdentity {

    /**
     * Authenticates a user.
     */
    private $_id;

    public function authenticate() {
        $user = Users::model()->findByAttributes(array('username' => $this->username));
        if ($user === null)
            $this->errorCode = self::ERROR_USERNAME_INVALID;
        else if ($user->password !== $this->password)
            $this->errorCode = self::ERROR_PASSWORD_INVALID;
        else {
            $this->_id = $user->id;
            $this->setState('title', $this->username);
            $this->setState('id', $user->id);   
            $this->errorCode = self::ERROR_NONE;
        }
        return !$this->errorCode;
    }

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

} 

请帮助我摆脱这个问题。

4

4 回答 4

3

您应该修复LoginForm

/**
 * Authenticates the password.
 * This is the 'authenticate' validator as declared in rules().
 */
public function authenticate($attribute, $params)
{
    // we only want to authenticate when no input errors
    if (! $this->hasErrors()) {
        $identity = new UserIdentity($this->email, $this->password);
        $identity->authenticate();
        switch ($identity->errorCode) {
            case UserIdentity::ERROR_NONE:
                $duration = ($this->rememberMe)
                    ? 3600*24*14 // 14 days
                    : 0; // login till the user closes the browser
                Yii::app()->user->login($identity, $duration);
                break;

            default:
                // UserIdentity::ERROR_USERNAME_INVALID
                // UserIdentity::ERROR_PASSWORD_INVALID
                // UserIdentity::ERROR_MEMBER_NOT_APPOVED
                $this->addError('', Yii::t('auth',
                    'Incorrect username/password combination.'));
                break;
        }
    }
}


class UsersController extends Controller 
{
    /**
     * Displays the login page
     */
    public function actionLogin() 
    {
        $model = new LoginForm;

        if (isset($_POST['LoginForm'])) {
            $model->attributes = $_POST['LoginForm'];

            $valid = $model->validate();
            if ($valid) {
                $this->redirect(Yii::app()->user->returnUrl);
            }
        }
        $this->render('login', array('model' => $model));
    }
}

你能显示你的配置吗?

于 2013-05-30T18:49:05.907 回答
1

答案可以在这里找到yii authentication error

您还可以在此处阅读有关 yii 身份验证的更多信息authentication and authorization

于 2013-05-30T18:42:34.103 回答
0

你不应该这样做:

$this->setState('id', $user[0]->id);  

setState 不应用于“id”。要返回“id”,您已经覆盖了 getId() 方法。

如果您确实需要设置它,请将其更改为:

$this->_id = $user[0]->id;

希望这有帮助。

问候,

于 2013-05-31T05:59:02.967 回答
0

试试这个,看看使用 Not(!) 运算符

if (!Yii::app()->user->isGuest){
            echo 'Welcome back Guest';
    } else {
            echo 'Welcome back '.Yii::app()->user->name;
    }
于 2013-05-31T04:20:00.840 回答