Я работал над входом пользователя в 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, ]); }
использованием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, ]); }
данных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
ничего нет. Я что-то пропустил? Пожалуйста, помогите мне.
Ну, проверка корректна, но вы делаете это
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 снова не вернет ничего (он вернет пустого пользователя, которого вы создаете), поскольку вы никогда его не устанавливали.
Также, что говорят дека, я надеюсь, что это само собой разумеется :).
Убедитесь, что вы выполнили yii\web\IdentityInterface
в User.php
namespace app\models; use yii\web\IdentityInterface; class User implements IdentityInterface { }
Если это так, убедитесь, что Yii::$app->user->enableSession
имеет значение TRUE
(которое должно быть по умолчанию ).