Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 19.02.2018 11:36:42

Разлогирование пользователя

Использую стандартную аутентификацию для входа пользователя. и посредник auth при проверках соответственно. Стоит задача выкинуть пользователя, если он зашел с другого браузера-компьютера и тд. понимаю, что нужно ка-кто или удалить ему сессию или хранить время входа его на сайт в таблицу БД и в сессии и сравнивать их. но не могу понять,как мне привязать это все с посредником auth, который каждый раз проверяет, залогинен ли пользователь. может кто сможет подсказать, как в таких случаях лучше и красивее сделать проверку и выбросить пользователя?

Изменено Yuliya (19.02.2018 11:37:07)

Не в сети

#2 19.02.2018 11:44:40

Re: Разлогирование пользователя

Как-то непонятно - а что, заходить на сайт будет разрешено только с определенного браузера или конкретного компьютера?
Уточни, кого надо выкидывать - того, кто уже залогинен или того, кто пытается залогиниться.

Не в сети

#3 19.02.2018 11:46:17

Re: Разлогирование пользователя

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

Изменено Yuliya (19.02.2018 11:48:01)

Не в сети

#4 19.02.2018 12:04:39

Re: Разлогирование пользователя

А если после входа сразу закрыть сессию, так не получится?

Не в сети

#5 19.02.2018 12:10:56

Re: Разлогирование пользователя

Храни где нибудь (в базе) идентификатор последней сессии.
В мидлеварах сравнивай-выкидывай.

Не в сети

#6 19.02.2018 12:12:16

Re: Разлогирование пользователя

так вот нужно писать свой мидлвар для проверки? и как его совместить с auth чтобы не делать и его проверку?)

Не в сети

#7 19.02.2018 12:13:01

Re: Разлогирование пользователя

А если после входа сразу закрыть сессию, так не получится?
тут надо как-то закрыть предыдущую сессию,если только хранить ее где-то...

Изменено Yuliya (19.02.2018 12:13:36)

Не в сети

#8 19.02.2018 12:31:57

Re: Разлогирование пользователя

А если после входа сразу закрыть сессию, так не получится?

А как ты узнаешь идентификатор сессии которую надо закрыть?
Не знаю, мне кажется проще хранить актуальный ид сессии для каждого пользователя и логаутить неподходящих.

Изменено covobo (19.02.2018 12:33:02)

Не в сети

#9 19.02.2018 12:32:47

Re: Разлогирование пользователя

так вот нужно писать свой мидлвар для проверки? и как его совместить с auth чтобы не делать и его проверку?)

Можно оставить стандартный и добавить свой, что-то типа LegalitySessionMiddleware.
Где и делать логаут, если текущая сессия - неактуальная.

Не в сети

#10 19.02.2018 12:33:26

Re: Разлогирование пользователя

А как ты узнаешь идентификатор сессии, которую надо закрыть?

Закрыть все, кроме текущей

Не в сети

#11 19.02.2018 12:33:49

Re: Разлогирование пользователя

Закрыть все, кроме текущей

Закрыть все - какие?)

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

Изменено covobo (19.02.2018 12:36:26)

Не в сети

#12 19.02.2018 12:36:21

Re: Разлогирование пользователя

Закрыть все - какие?)

Да, действительно )

Не в сети

#13 19.02.2018 12:55:55

Re: Разлогирование пользователя

Мне кажется сначала надо решить задачу "кто сейчас онлайн?". Пример: https://github.com/thomastkim/laravel-online-users

То есть сначала настраиваешь параметры сессии на использование БД. Затем, имея список активных пользовательских сессий в базе, творишь с ним что захочешь smile


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Не в сети

#14 19.02.2018 12:59:04

Re: Разлогирование пользователя

Получили список сессий, как узнать ту, которую надо закрыть?

Не в сети

#15 20.02.2018 20:02:45

Re: Разлогирование пользователя

Morry пишет:

Получили список сессий, как узнать ту, которую надо закрыть?

Это к кому вопрос? smile Я так думаю, пусть Топикстартер решает кто лишний и почему.

Имеем таблицу, в которой есть и user_id, и ip_address, и user_agent. Которые там "лишние" — It depends, как говориться. big_smile

Изменено artoodetoo (20.02.2018 20:04:03)


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Не в сети

#16 20.02.2018 23:49:23

Re: Разлогирование пользователя

По-моему проблему раздули из ничего. Не нужно никого "разлогинивать", достаточно добавить в функцию распаковки/проверки сессии проверку на идентификатор последней сессии, как говорит covobo. То есть в таблицу с пользователями (или, лучше, в Redis) добавляется новая колонка целочисленного типа, которая монотонно растет от 0 вверх. При каждом корректном заходе счетчик увеличивается и его значение пишется в сессию наравне с ID пользователя (это можно сделать атомарно, см. этот пост), а в функции распаковки сессии (или в middleware) появляется проверка вида if counter_in_this_session != counter_in_DB -> return "invalid_session".

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

Не в сети

Подвал раздела