页面重定向后Yii2用户身份丢失

时间:2015-01-02 06:19:45

标签: php authentication login yii2

我正在使用yii2中的用户登录,但是不是使用活动记录,而是另一台服务器处理用户用户名和密码的验证。以下是我要解决的问题:

LoginForm.php中,我在validatePassword()中进行了一些更改,apiRest()是我用来向负责验证的远程服务器发送请求的方法。

if (!$this->hasErrors()) {

    $json = '{
            "username": "' . $this->username . '",
            "password": "' . $this->password . '"
            }';
    $response = $this->apiRest("POST", "104.130.126.68:3000/api/users/login", $json);

    $user = $this->getUser();

    if(!$user || isset($response['error'])) {
        $this->addError($attribute, $response['error']['message']);
    }

    if(isset($response['data'])) {
        $user->id = $response['data']['userId'];
        $user->username = $this->username;
        $user->ttl = $response['data']['ttl'];
        $user->created = $response['data']['created'];
        $user->accessToken = $response['data']['id'];
    }
}

LoginForm.php/getUser()中,我也进行了一些修改:

if ($this->_user === false) {
    $this->_user = User::createNewUser();
}

return $this->_user;

我在User.php的位置:

public static function createNewUser()
{
    $user = [
        'id' => '',
        'username' => '',
        'ttl' => '',
        'created' => '',
        'accessToken' => '',
    ];
    return new static($user);
}

一切似乎都很好,我也可以在SiteController.php/actionLogin()中打印出用户身份:

if ($model->load(Yii::$app->request->post()) && $model->login()) {
    print('<pre>');
    print_r(Yii::$app->user->identity->username);
    die();
    return $this->redirect(['set/index']);
} else {
    $this->layout = "plain";
    return $this->render('login', [
        'model' => $model,
    ]);
}

然而,问题是在页面重定向之后,用户身份消失了; Yii::$app->user->identity中没有任何内容。我错过了什么吗?请帮帮我。

2 个答案:

答案 0 :(得分:0)

检查您是否已在yii\web\IdentityInterface

中实施User.php
namespace app\models;

use yii\web\IdentityInterface;

class User implements IdentityInterface
{

}

如果是这种情况,请务必检查Yii::$app->user->enableSessionTRUE(应该是by default)。

答案 1 :(得分:0)

嗯,验证看起来很好,但是你这样做

if(isset($response['data'])) {
        $user->id = $response['data']['userId'];
        $user->username = $this->username;
        $user->ttl = $response['data']['ttl'];
        $user->created = $response['data']['created'];
        $user->accessToken = $response['data']['id'];
    }

但您从未将用户设置回模型。我相信你最终应该有一个

$this->_user = $user;

您的登录信息可能如下所示

/**
 * Logs in a user using the provided username and password.
 *
 * @return boolean whether the user is logged in successfully
 */
public function login()
{
    if ($this->validate()) {
        return $this->getUser()->login($this->rememberMe ? 2592000 : 0);
    } else {
        return false;
    }
}

getUser将再次返回任何内容(它将返回您创建的空用户),因为您从未实际设置它。

deacs说的也是我希望不用说:)。