#php #yii #yii2
#php #yii #yii2
Вопрос:
У меня есть приложение Yii2, в котором я аутентифицирую пользователя из стороннего API, и как только пользователь аутентифицируется, я регистрирую пользователя и устанавливаю идентификатор, и все работает нормально. Но когда я перехожу на любую другую страницу, идентификатор пользователя становится нулевым, и пользователь становится гостевым пользователем.
Вот моя форма входа:
<?php
namespace appmodels;
use appcomponentsRestBehavior;
use appmodelswebLoginIdentity;
use Yii;
use yiibaseModel;
use yiihelpersJson;
use yiihelpersVarDumper;
use yiiwebIdentityInterface;
/**
* LoginForm is the model behind the login form.
*
* @property User|null $user This property is read-only.
*
*/
class LoginForm extends Model
{
public $email;
public $password;
public $company_id;
public $companies=[];
public $token;
private $_user = false;
public function behaviors()
{
return [
RestBehavior::class
];
}
/**
* @return array the validation rules.
*/
public function rules()
{
return [
[['email', 'password','company_id'], 'required'],
];
}
/**
* Logs in a user using the provided username and password.
* @return bool whether the user is logged in successfully
*/
public function login()
{
return Yii::$app->user->login($this->getUser(), 0);
}
/**
* Finds user by [[username]]
*
* @return User|null
*/
public function getUser()
{
if ($this->_user === false) {
$this->_user = LoginIdentity::findUser($this->attributes);
}
return $this->_user;
}
}
Вот мой пользовательский класс LoginIdentity:
<?php
namespace appmodelsweb;
use appcomponentsRestBehavior;
use Yii;
use yiihelpersJson;
use yiihelpersUrl;
use yiihelpersVarDumper;
class LoginIdentity extends yiibaseBaseObject implements yiiwebIdentityInterface
{
public $resource_id;
public $token;
/**
* {@inheritdoc}
*/
public function behaviors()
{
return [
RestBehavior::class
];
}
public static function findUser($params)
{
if(!empty(Yii::$app->user->identity))
{
return new static([
'resource_id'=>self::getId(),
'token'=>self::getAuthKey()
]);
}
else
{
Yii::$app->controller->sendPOST('/login',$params);
if(Yii::$app->response->statusCode===200)
{
$response=Json::decode(Yii::$app->response->data);
$identity=new static([
'resource_id'=>$response['resource']['resource_id'],
'token'=>$response['token']
]);
Yii::$app->session->set('resource_id',$response['resource']['resource_id']);
Yii::$app->session->set('token',$response['token']);
return $identity;
}
return null;
}
}
/**
* {@inheritdoc}
*/
public static function findIdentity($id)
{
$session=Yii::$app->session;
if(!empty($session['resource_id'])amp;amp;!empty($session['token']))
{
return new static([
'resource_id'=>$session['resource_id'],
'token'=>$session['token']
]);
}
return null;
}
/**
* {@inheritdoc}
* @param LcobucciJWTToken $token
*/
public static function findIdentityByAccessToken($token, $type = null)
{
}
/**
* Finds user by username
*
* @param string $username
* @return static|null
*/
public static function findByUsername($username)
{
}
/**
* {@inheritdoc}
*/
public function getId()
{
return $this->resource_id;
}
/**
* {@inheritdoc}
*/
public function getAuthKey()
{
return $this->token;
}
/**
* {@inheritdoc}
*/
public function validateAuthKey($authKey)
{
}
/**
* Validates password
*
* @param string $password password to validate
* @return bool if password provided is valid for current user
*/
public function validatePassword($password)
{
}
}
Как ни странно, весь код отлично работает на моем локальном компьютере, то есть на localhost. Но на сервере пользователь входит в систему, но выходит из системы, когда он посещает любой новый аутентифицированный маршрут. Я проверил папку сервера / var/ lib/ php/ sessions, сеанс сохраняется правильно, поэтому проблем с разрешениями нет.
Может кто-нибудь, пожалуйста, скажите мне, что здесь не так? Почему он работает на моем локальном компьютере, а не удаленно.
Спасибо.
Комментарии:
1. Но когда я перехожу на любую другую страницу, идентификатор пользователя становится нулевым, и пользователь становится гостевым пользователем. … Как ни странно, весь код отлично работает на моем локальном компьютере, то есть на localhost. Но на сервере пользователь входит в систему, но выходит из системы, когда он посещает любой новый аутентифицированный маршрут. Значит, у вас есть эта проблема только на сервере? Тогда это должен быть только сервер, если он нормально работает на вашем локальном компьютере?
2. Есть причина, по которой вы должны реализовать функции, указанные
yiiwebIdentityInterface
. Причина, по которой он не работает, вероятно, в том, что вы не реализовали эти функции. Я предполагаю, что Yii вызываетfindByUsername
для установки LoginIdentity. Но вы ничего там не возвращаете, поэтому оно интерпретируется как null.
Ответ №1:
Это не было связано с реализацией Yii2 или Identity class. Код был правильным во всех смыслах. Причина заключалась в том, что на моем сервере было cookie_secure
установлено значение true, означающее, что сеанс может быть установлен только по протоколу SSL, но я пытался войти в систему по небезопасному источнику, т.е. http. Также мой сайт работал по протоколу SSL, но при загрузке страницы он стал небезопасным или http из-за недопустимого пути к значку. Итак, браузер firefox показал в консоли, что файл cookie отклоняется сервером, когда клиент работает по HTTP, в то время как консоль Chrome молчала о том, что происходило за кулисами.
Ответ №2:
Спасибо Хаммаду за ответ, никто другой не дал мне реального решения, но я решил его в «web.php » конфигурационный файл, просто меняю параметр ‘secure’ => true на false. Причина заключалась в том, что я использовал http вместо https (без SSL), я использую это временное решение:
'session' => [
'cookieParams' => [
'secure' => false,
],
],