Подтвердить что ты не робот

Попытка избежать дублирования записей сеанса пользователя в таблице сеанса: Laravel

Пример данных в этой таблице выглядит следующим образом:

введите описание изображения здесь

В таблице есть несколько дублированных записей сеанса пользователя.

поставщика\Laravel\рамки\SRC\Осветите\Session\DatabaseSessionHandler.php

В приведенном выше пути к файлу мы имеем ниже метод

public function write($sessionId, $data)
{
    $payload = $this->getDefaultPayload($data);

    if (! $this->exists) {
        $this->read($sessionId);
    }
    if ($this->exists) {
        $this->getQuery()->where('id', $sessionId)->update($payload);
    } else {
        $payload['id'] = $sessionId;

        $this->getQuery()->insert($payload);
    }

    $this->exists = true;
}

Он проверяет идентификатор сеанса.

Вопрос

Могу ли я избежать создания дубликатов записей сеанса пользователя в таблице сеансов? Есть ли флаг, который делает это в файле конфигурации сеанса?

4b9b3361

Ответ 1

Кажется, это ошибка в твоем обмане, должно быть так?

 if (! $this->exists) {
    $this->read($sessionId);
}else{

   if ($this->exists) {
       $this->getQuery()->where('id', $sessionId)->update($payload);
   } else {
       $payload['id'] = $sessionId;
       $this->getQuery()->insert($payload);
   }
}

Ответ 2

Из вашего вопроса вы хотите оставить только один сеанс пользователя в базе данных, что означает, что один пользователь может только войти с одного устройства, например, если вы уже вошли в систему из хрома, то, если вы входите в систему из firefox, ваш статус регистрации хрома будет удален.

Чтобы добиться этого, вы можете написать функцию в App\Http\Controllers\Auth\AuthController:

public function authenticated(Request $request,User $user){
    $previous_session = $user->session_id;

    if ($previous_session) {
    \Session::getHandler()->destroy($previous_session);
    }

    Auth::user()->session_id = \Session::getId();
    Auth::user()->save();
    return redirect()->intended($this->redirectPath());
}

эта функция будет уничтожать предварительный сеанс из базы данных до входа в систему. для получения дополнительной информации вы должны проверить Trait: Illuminate\Foundation\Auth\AuthenticatesUsers