у меня есть таблица 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.
просто отправьте POST-запрос
<a class = "dropdown-item p-2 header-menu-logout-link" href = "{{ route('logout') }}" title = "Logout" onclick = "event.preventDefault();document.getElementById('logout-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>





Я обнаружил, что нужно переопределить 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, вы никогда не должны редактировать файлы в поставщике, поскольку они, вероятно, будут перезаписаны будущими обновлениями.
В дополнение к тому, что изменение файлов поставщика всегда является плохой идеей, комментирование функций безопасности, чтобы страница работала, также, как правило, не является хорошим решением, и, конечно, его не следует рекомендовать другим. В случае изменения сеансов некоторые сайты (например, github) предлагают в верхней части страницы кнопку перезагрузки для обновления сеанса, когда обнаруживают, что пользователь вошел в другую вкладку. Это требует дополнительной работы для реализации, но является лучшим решением. Я уверен, что есть и другие решения.
Мне также понадобился старый идентификатор сеанса при обработке событий Illuminate\Auth\Events\Login.
Нашел два дополнительных варианта.
request()->cookies()->get(session()->getName()),Illuminate\Auth\Events\Attempting и где-нибудь сохранить текущий идентификатор в сеансе. Таким образом, вы можете проверить это в обработчике событий Login.
Используете ли вы какой-либо фреймворк js для выхода из системы или просто отправляете веб-запрос POST?