Как лучше реализовать механизм множественных сессий?
Доброго времени суток. Имеется сайт с авторизацией и следующим механизмом сессий:
При успешном логине генерируются 2 случайные строки - current_session и long_session. current_session сохраняется в обычную php сессию, long_session сохраняется в куки. Оба эти значения присваиваются пользователю в БД.
Авторизация проверяется таким образом: если создана php сессия, проверяем её актуальность, запрашивая из БД current_session пользователя и сравниваем с текущим в сессии. Если php сессии нет, то проверяем куки длительной сессии и, если они актуальны, создаём php сессию.
Всё это отлично работает, но только если залогиниться с другого браузера/устройства, то старая авторизация уничтожается, ведь переписываются current_session и long_session.
Мне захотелось расширить функционал и возможности сайта, добавив множественные сессии (сидеть под одним аккаунтом с разных устройств одновременно), а в личный кабинет добавить историю входов в аккаунт и возможность сброса сессий.
Для реализации этой идеи мне пришла мысль сделать таблицу в БД со следующими полями: current_session, long_session, user_id, login_time, ip.
Поля current_session и long_session имеют тот же смысл, что и в прошлой реализации, с user_id и ip всё понятно, login_time - дата логина, чтобы отслеживать устаревание сессии.
При логине добавляем запись, все проверки остаются практически те же, а при разлогине или сбросе сессии обнуляем current_session и long_session.
А вопросы, собственно, вот в чём. Нормальный ли механизм и какие могут быть проблемы? Например, как одну из проблем я вижу – множественные запросы на логин будут плодить записи в БД, поэтому, возможно, придётся делать ограничение на количество одновременных сессий или придумывать механизм очистки. В каких открытых проектах можно посмотреть реализацию подобных механизмов?
Мне кажется у вас всё слишком усложнено. Поэтому реализовать множественные сессии в таком решении может быть затруднительно. Что можно в Вашем случае сделать?
Вам не нужны current_session и long_session. Используйте классический механизм сессий. Чтобы в куки записывался id сессии и её время жизни, а в базу данных id сессии и id пользователя - остальные данные типа времени входа - по вкусу. Храните записи сессий в базе таким образом, чтобы на один id пользователя можно было сделать несколько записей. Таким образом у вас не будут отваливаться сессии при входе на разных устройствах. И не переживайте за записи в БД - они не будут занимать много места. В конце концов можно записывать таймштамп истечения срока сессии и по крону периодически проверять и чистить старые записи.
Пример реализации подобного решения вы можете найти в библиотеке birke/remembermeссылка на github
current_session нужно для прозрачного управления сессиями, чтобы была возможность разлогинить пользователя принудительно из админки, либо при смене пароля, либо из личного кабинета.
Например, пользователь где-то логинился и не вышел, а вспомнил об этом дома, если браузер не перезагружали, то в php сессии остались все данные и есть возможность делать что угодно, а удалить их удалённо нет возможности.