PHP: ограничение сессий, идентификация потеряной сесии

Обсуждение серверного программирования.

Модераторы: Duncon, Yurich

Ответить
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

PHP-приложение реализуетс сервис, требующий авторизации пользователей.
Используется механизм сессий PHP.
Требуется ограничить количество одновременных сесий под одним логином.
Можно ли это вообще реализовать?
Понятно, что если пользователь по завершении работы нажмет кнопку Выход, то можно его сессию деинициализировать, а как быть если он просто закрыл браузер? Как идентифицировать, что сессия потеряна?

Мне видятся следующие варианты:
1) Установить таймаут неактивности сессии (теоретически где-то должен настраиваться в PHP, но я пока не нашел где). В этом случае, если пользователь забыл нажать "Выход", а также и просто при разрыве соединения будет вынужден дождаться таймаута, прежде чем снова сможет войти
2) Запускать в браузете JScript, который будет посылать ALive запросы, означающие, что сесия жива. По их отсутсвию закрывать сессию, и требовать повторной авторизации
3) ...?
Аватара пользователя
Duncon
Сообщения: 2085
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

Сессия живёт до момента закрытия броузера, если конечно руками не задавать сколько ей жить.. (сервер через некоторое время убъёт сессию если тупо оставить включённым комп под сессией ну или тупо не закрыть броузер это уже в настройках php на серваке выставленно)
Дай имя сессии и проверяй при входе существует ли она, если да то юзер на отдых или какие там планы.. (Можно так же организовать счётчик сколько юзеров в 1 сесии итд итп)
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Duncon писал(а):Сессия живёт до момента закрытия броузера, если конечно руками не задавать сколько ей жить..


Так. Но при этом момент закрытия браузера никак ведь не поймать. Т.е. если я браузер перезапущу, то предыдущая сесия уже просто не будет опознаваться, так как будет начата новая.
Duncon писал(а):(сервер через некоторое время убъёт сессию если тупо оставить включённым комп под сессией ну или тупо не закрыть броузер это уже в настройках php на серваке выставленно)


А можно меня ткнуть носом в совокупность параметров из PHP.INI где это выставляется? А то я что-то туплю.... :(
Duncon писал(а):Дай имя сессии и проверяй при входе существует ли она, если да то юзер на отдых или какие там планы.. (Можно так же организовать счётчик сколько юзеров в 1 сесии итд итп)


Давай по порядку:
При запуске скрипта в самом начале делаю session_start
Если пользователь заходит на страницу впервые, то для него генерится сессия, если повторно, то из $_SESSION я могу доставать значения переменных, которые установил в предыдущий заход.
Пользуясь этим я считываю имя пользователя и пароль. Если неверно, увеличиваю счетчик неуспешных логинов, иначе в $_SESSION записываю Login. Все следующие запросы обрабатываются с учетом того, что логин уже произошел.

Теперь другой юзер заходит на тот же сайт и пытается залогиниться под тем же именем.
1) Как в этой новой сессии определить, что уже есть другая сессия, ассоциированная с этим логином?
2) Как высвободить этот логин, когда та другая сессия завершится (хоть бы и по разрыву соединения или таймауту?
Аватара пользователя
Duncon
Сообщения: 2085
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

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

Угу если нужно опознование тут уже вопросы к кукисам.. (сессии живут только на сервере)

А можно меня ткнуть носом в совокупность параметров из PHP.INI где это выставляется? А то я что-то туплю....
Поищи где-нить, но этот момент врядле даст расковырять хостинг.. (Де факто оно никогда и не нужно, дефолт где-то несколько минут 5 -15)
задать время жизни можно так

Код: Выделить всё

session.gc_maxlifetime 3600 (в секундах) 


Давай по порядку:
При запуске скрипта в самом начале делаю session_start
Если пользователь заходит на страницу впервые, то для него генерится сессия, если повторно, то из $_SESSION я могу доставать значения переменных, которые установил в предыдущий заход.
Пользуясь этим я считываю имя пользователя и пароль. Если неверно, увеличиваю счетчик неуспешных логинов, иначе в $_SESSION записываю Login. Все следующие запросы обрабатываются с учетом того, что логин уже произошел.
Угу перед этим если хочешь пользоваться 1 сессией для всех обзови её session_name() следом стартуешь сессию. Главное нужно помнить что session_start нужно вызывать везде где планируется работа с переменными сессии. Я вообще не пользуюсь сессион регистер и прочей фигнёй переменные в сессию пишу так
[php]$_SESSION['name'] = 'Пихто';[/php]

Теперь другой юзер заходит на тот же сайт и пытается залогиниться под тем же именем.
1) Как в этой новой сессии определить, что уже есть другая сессия, ассоциированная с этим логином?
2) Как высвободить этот логин, когда та другая сессия завершится (хоть бы и по разрыву соединения или таймауту?
Тебе нужно назвать сессию иначе для другого юзера новая сессия. Ну а дальше лучше отбирать руль у предидущего юзера, представь ситуацию что злобный я поставил бота на машине и ушёл гулять он будет тупо обновлять страницу раз в пару минут, всё сессия будет держаться пока свет или инет не отрубят..

зы Пойми главную фишку php - всё массивы и сессии тоже :)
Ответить