Потеря личности пользователя 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 ничего нет. Я что-то пропустил? Помогите мне, пожалуйста.


person hugoinperson    schedule 02.01.2015    source источник


Ответы (2)


Что ж, проверка выглядит нормально, как бы вы это ни делали

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 снова ничего не вернет (он вернет пустого пользователя, которого вы создали), поскольку вы никогда его не устанавливали.

Кроме того, что говорит дьяк, я надеюсь, что это само собой разумеющееся :).

person Mihai P.    schedule 02.01.2015

Убедитесь, что вы внедрили yii\web\IdentityInterface в User.php

namespace app\models;

use yii\web\IdentityInterface;

class User implements IdentityInterface
{

}

Если это так, убедитесь, что Yii::$app->user->enableSession равно TRUE (это должно быть по умолчанию).

person deacs    schedule 02.01.2015