PHP-приложение реализуетс сервис, требующий авторизации пользователей.
Используется механизм сессий PHP.
Требуется ограничить количество одновременных сесий под одним логином.
Можно ли это вообще реализовать?
Понятно, что если пользователь по завершении работы нажмет кнопку Выход, то можно его сессию деинициализировать, а как быть если он просто закрыл браузер? Как идентифицировать, что сессия потеряна?
Мне видятся следующие варианты:
1) Установить таймаут неактивности сессии (теоретически где-то должен настраиваться в PHP, но я пока не нашел где). В этом случае, если пользователь забыл нажать "Выход", а также и просто при разрыве соединения будет вынужден дождаться таймаута, прежде чем снова сможет войти
2) Запускать в браузете JScript, который будет посылать ALive запросы, означающие, что сесия жива. По их отсутсвию закрывать сессию, и требовать повторной авторизации
3) ...?
PHP: ограничение сессий, идентификация потеряной сесии
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
Сессия живёт до момента закрытия броузера, если конечно руками не задавать сколько ей жить.. (сервер через некоторое время убъёт сессию если тупо оставить включённым комп под сессией ну или тупо не закрыть броузер это уже в настройках php на серваке выставленно)
Дай имя сессии и проверяй при входе существует ли она, если да то юзер на отдых или какие там планы.. (Можно так же организовать счётчик сколько юзеров в 1 сесии итд итп)
Дай имя сессии и проверяй при входе существует ли она, если да то юзер на отдых или какие там планы.. (Можно так же организовать счётчик сколько юзеров в 1 сесии итд итп)
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
Duncon писал(а):Сессия живёт до момента закрытия броузера, если конечно руками не задавать сколько ей жить..
Так. Но при этом момент закрытия браузера никак ведь не поймать. Т.е. если я браузер перезапущу, то предыдущая сесия уже просто не будет опознаваться, так как будет начата новая.
Duncon писал(а):(сервер через некоторое время убъёт сессию если тупо оставить включённым комп под сессией ну или тупо не закрыть броузер это уже в настройках php на серваке выставленно)
А можно меня ткнуть носом в совокупность параметров из PHP.INI где это выставляется? А то я что-то туплю....

Duncon писал(а):Дай имя сессии и проверяй при входе существует ли она, если да то юзер на отдых или какие там планы.. (Можно так же организовать счётчик сколько юзеров в 1 сесии итд итп)
Давай по порядку:
При запуске скрипта в самом начале делаю session_start
Если пользователь заходит на страницу впервые, то для него генерится сессия, если повторно, то из $_SESSION я могу доставать значения переменных, которые установил в предыдущий заход.
Пользуясь этим я считываю имя пользователя и пароль. Если неверно, увеличиваю счетчик неуспешных логинов, иначе в $_SESSION записываю Login. Все следующие запросы обрабатываются с учетом того, что логин уже произошел.
Теперь другой юзер заходит на тот же сайт и пытается залогиниться под тем же именем.
1) Как в этой новой сессии определить, что уже есть другая сессия, ассоциированная с этим логином?
2) Как высвободить этот логин, когда та другая сессия завершится (хоть бы и по разрыву соединения или таймауту?
Так. Но при этом момент закрытия браузера никак ведь не поймать. Т.е. если я браузер перезапущу, то предыдущая сесия уже просто не будет опознаваться, так как будет начата новая.
Угу если нужно опознование тут уже вопросы к кукисам.. (сессии живут только на сервере)
Поищи где-нить, но этот момент врядле даст расковырять хостинг.. (Де факто оно никогда и не нужно, дефолт где-то несколько минут 5 -15)
А можно меня ткнуть носом в совокупность параметров из PHP.INI где это выставляется? А то я что-то туплю....
задать время жизни можно так
Код: Выделить всё
session.gc_maxlifetime 3600 (в секундах)
Угу перед этим если хочешь пользоваться 1 сессией для всех обзови её session_name() следом стартуешь сессию. Главное нужно помнить что session_start нужно вызывать везде где планируется работа с переменными сессии. Я вообще не пользуюсь сессион регистер и прочей фигнёй переменные в сессию пишу так
Давай по порядку:
При запуске скрипта в самом начале делаю session_start
Если пользователь заходит на страницу впервые, то для него генерится сессия, если повторно, то из $_SESSION я могу доставать значения переменных, которые установил в предыдущий заход.
Пользуясь этим я считываю имя пользователя и пароль. Если неверно, увеличиваю счетчик неуспешных логинов, иначе в $_SESSION записываю Login. Все следующие запросы обрабатываются с учетом того, что логин уже произошел.
[php]$_SESSION['name'] = 'Пихто';[/php]
Тебе нужно назвать сессию иначе для другого юзера новая сессия. Ну а дальше лучше отбирать руль у предидущего юзера, представь ситуацию что злобный я поставил бота на машине и ушёл гулять он будет тупо обновлять страницу раз в пару минут, всё сессия будет держаться пока свет или инет не отрубят..
Теперь другой юзер заходит на тот же сайт и пытается залогиниться под тем же именем.
1) Как в этой новой сессии определить, что уже есть другая сессия, ассоциированная с этим логином?
2) Как высвободить этот логин, когда та другая сессия завершится (хоть бы и по разрыву соединения или таймауту?
зы Пойми главную фишку php - всё массивы и сессии тоже
