Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Использую стандартную аутентификацию для входа пользователя. и посредник auth при проверках соответственно. Стоит задача выкинуть пользователя, если он зашел с другого браузера-компьютера и тд. понимаю, что нужно ка-кто или удалить ему сессию или хранить время входа его на сайт в таблицу БД и в сессии и сравнивать их. но не могу понять,как мне привязать это все с посредником auth, который каждый раз проверяет, залогинен ли пользователь. может кто сможет подсказать, как в таких случаях лучше и красивее сделать проверку и выбросить пользователя?
Изменено Yuliya (19.02.2018 11:37:07)
Не в сети
Как-то непонятно - а что, заходить на сайт будет разрешено только с определенного браузера или конкретного компьютера?
Уточни, кого надо выкидывать - того, кто уже залогинен или того, кто пытается залогиниться.
Не в сети
того же самого пользователя. т е он не должен быть залогинен с нескольких браузеров. если под его аккаунктом заходить с другого браузера,то с первого должно выбросить. стандартно так не происходит, открывается вторая сессия у него
Изменено Yuliya (19.02.2018 11:48:01)
Не в сети
А если после входа сразу закрыть сессию, так не получится?
Не в сети
Храни где нибудь (в базе) идентификатор последней сессии.
В мидлеварах сравнивай-выкидывай.
Не в сети
так вот нужно писать свой мидлвар для проверки? и как его совместить с auth чтобы не делать и его проверку?)
Не в сети
А если после входа сразу закрыть сессию, так не получится?
тут надо как-то закрыть предыдущую сессию,если только хранить ее где-то...
Изменено Yuliya (19.02.2018 12:13:36)
Не в сети
А если после входа сразу закрыть сессию, так не получится?
А как ты узнаешь идентификатор сессии которую надо закрыть?
Не знаю, мне кажется проще хранить актуальный ид сессии для каждого пользователя и логаутить неподходящих.
Изменено covobo (19.02.2018 12:33:02)
Не в сети
так вот нужно писать свой мидлвар для проверки? и как его совместить с auth чтобы не делать и его проверку?)
Можно оставить стандартный и добавить свой, что-то типа LegalitySessionMiddleware.
Где и делать логаут, если текущая сессия - неактуальная.
Не в сети
А как ты узнаешь идентификатор сессии, которую надо закрыть?
Закрыть все, кроме текущей
Не в сети
Закрыть все, кроме текущей
Закрыть все - какие?)
Можно попробовать перебрать все файлы сессии (или где ты хранишь) и удалить все сессии конкретного юзера, но, думаю будут проблемы, если драйвер сессии будет меняться. (нет стандартного функционала, который вернет все сессии конкретного пользователя)
Взвешивать надо, что лучше для твоего случая.
Изменено covobo (19.02.2018 12:36:26)
Не в сети
Закрыть все - какие?)
Да, действительно )
Не в сети
Мне кажется сначала надо решить задачу "кто сейчас онлайн?". Пример: https://github.com/thomastkim/laravel-online-users
То есть сначала настраиваешь параметры сессии на использование БД. Затем, имея список активных пользовательских сессий в базе, творишь с ним что захочешь
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Не в сети
Получили список сессий, как узнать ту, которую надо закрыть?
Не в сети
Получили список сессий, как узнать ту, которую надо закрыть?
Это к кому вопрос? Я так думаю, пусть Топикстартер решает кто лишний и почему.
Имеем таблицу, в которой есть и user_id, и ip_address, и user_agent. Которые там "лишние" — It depends, как говориться.
Изменено artoodetoo (20.02.2018 20:04:03)
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Не в сети
По-моему проблему раздули из ничего. Не нужно никого "разлогинивать", достаточно добавить в функцию распаковки/проверки сессии проверку на идентификатор последней сессии, как говорит covobo. То есть в таблицу с пользователями (или, лучше, в Redis) добавляется новая колонка целочисленного типа, которая монотонно растет от 0 вверх. При каждом корректном заходе счетчик увеличивается и его значение пишется в сессию наравне с ID пользователя (это можно сделать атомарно, см. этот пост), а в функции распаковки сессии (или в middleware) появляется проверка вида if counter_in_this_session != counter_in_DB -> return "invalid_session".
Таким образом, с точки зрения приложения несовпадающий счетчик в сессии ничем не отличается от просто несуществующего идентификатора этой сессии, так что удалять старые не требуется - они сами инвалидируются, как только произойдет новый вход и счетчик увеличится.
Не в сети
Страницы 1