Laravel Session::getId() отличается при входе в систему и выходе из нее

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

структура таблицы для user_logins:

    'session_id',
    'user_id',
    'ip_address',
    'user_agent',
    'browser_name',
    'location',
    'login_at',
    'is_active'

у меня есть прослушиватель UserEventSubscriber с двумя функциями, как показано ниже:

public function handleUserLogin($event) {
     UserLogin::create([
        'session_id'=>Session::getId(),
        ...
     ]);
}   

я получаю Session::getId() = mpT6RDsl54JExkejrqf3fnYiFLzbR2pTb2qfNHBe в handleUserLogin функции

теперь, когда пользователь выходит из системы, я хочу обновить/удалить запись таблицы из таблицы user_logins, где session_id = Session::getId()

 public function handleUserLogout($event) {
        dd(Session::getId());
        //UserLogin::where('session_id',Session::getId())->delete();
 }

в функции handleUserLogout я получаю другой идентификатор сеанса

Session::getId() qLYngAx1Vs8VBhxm0oCKZO3fDwun02UEXRyDm0Hi поэтому я не могу обновить/удалить запись в user_logins таблице

Я видел sessions таблицу с идентификатором qLYngAx1Vs8VBhxm0oCKZO3fDwun02UEXRyDm0Hi, который совпадает с идентификатором, который я получаю при выходе из системы.

поэтому мой вопрос: почему я получаю другой идентификатор сеанса для функции входа пользователя? и что мне делать, чтобы получить тот же идентификатор сеанса, используя Session::getId() в функциях handleUserLogin и handleUserLogout.

Используете ли вы какой-либо фреймворк js для выхода из системы или просто отправляете веб-запрос POST?

Lakmal Premaratne 03.07.2019 07:24

просто отправьте POST-запрос

Saurabh Mistry 03.07.2019 07:34
<a class = "dropdown-item p-2 header-menu-logout-link" href = "{{ route('logout') }}" title = "Logout" onclick = "event.preventDefault();document.getElementById('log‌​out-form').submit();‌​"><span style = "margin-right:9px;"><i class = "fas fa-sign-out-alt"></i></span>Logout</a> <form id = "logout-form" action = "{{ route('logout') }}" method = "POST" style = "display:none;"> {{ csrf_field() }} </form> </div>
Saurabh Mistry 03.07.2019 07:34
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
3
1 581
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Я обнаружил, что нужно переопределить sendLoginResponse из AuthenticatesUsers в Auth/LoginController

$request->session()->regenerate() генерирует новый идентификатор сеанса после входа в систему, поэтому, если вы хотите получить тот же идентификатор, что и раньше, закомментируйте эту строку.

 protected function sendLoginResponse(Request $request)
    {
        // $request->session()->regenerate();   <-- this line is generating new session after user login 
        $this->clearLoginAttempts($request);

        return $this->authenticated($request, $this->guard()->user())
                ?: redirect()->intended($this->redirectPath());
    }

Вы, сэр, мой герой. У меня возникла та же проблема, но поскольку я использую Fortify, код, который мне нужно было прокомментировать, находился в следующем файле:

/vendor/laravel/fortify/src/Actions/PrepareAuthenticatedSession.php

Первая строка функции handle гласит:

$request->session()->regenerate();

Прокомментируйте это, и идентификатор сеанса не будет восстанавливаться после аутентификации.

Для будущих сотрудников Google это также приводило к возврату кода состояния 419 в запросах ajax (которые передавали токен CSRF, полученный из метатега на странице) после успешного входа в систему, выполненного с помощью запроса ajax.

Осторожно: как указывает Mtxz здесь stackoverflow.com/a/67176551/2917183, вы никогда не должны редактировать файлы в поставщике, поскольку они, вероятно, будут перезаписаны будущими обновлениями.

b4tch 15.07.2021 16:54

В дополнение к тому, что изменение файлов поставщика всегда является плохой идеей, комментирование функций безопасности, чтобы страница работала, также, как правило, не является хорошим решением, и, конечно, его не следует рекомендовать другим. В случае изменения сеансов некоторые сайты (например, github) предлагают в верхней части страницы кнопку перезагрузки для обновления сеанса, когда обнаруживают, что пользователь вошел в другую вкладку. Это требует дополнительной работы для реализации, но является лучшим решением. Я уверен, что есть и другие решения.

Travis Britz 23.03.2022 02:50

Мне также понадобился старый идентификатор сеанса при обработке событий Illuminate\Auth\Events\Login. Нашел два дополнительных варианта.

  • получить его из файла cookie сеанса; например request()->cookies()->get(session()->getName()),
  • или прослушать более раннее событие, например. Illuminate\Auth\Events\Attempting и где-нибудь сохранить текущий идентификатор в сеансе. Таким образом, вы можете проверить это в обработчике событий Login.

Другие вопросы по теме