Royal Flash
-=MaestrO=-
Блокировка одновременного доступа боле 1-го пользователя с 1 учетной записи.
Ситуация: есть 1 учетная запись: логин: test, пароль: test. Пользователь Иванов зашел в систему под логином test, а через 5 минут пользователь Сидоров также пытается зайти под тем же логином. Как запрограммировать скрипт для таких случаев?
1. Самый простой вариант – пустить пользователя Сидоров в систему, оставив там же Иванова, но в таком случае, нарушается основополагающая концепция авторизации: каждый пользователь имеет свой уникальный логин. Также, нельзя будет с уверенностью сказать, кто именно, из этих пользователей произвел действия, записанные на логин test? Да и могут возникнуть некоторые серьезные коллизии в разделах, чувствительных к одновременному присутствию нескольких одинаковых логинов.
2. Вариант, немного сложнее первого – «выкинуть» пользователя Иванов из системы, сразу перед тем, как пустить Сидорова. Но в этом случае, может произойти потеря данных у Иванова: набрав в форме <textarea> грандиозное сочинение и нажав кнопку «Submit», он может обнаружить форму для ввода логина и пароля, вместо сообщения: «Ваше сообщение успешно сохранено». Можно, конечно, сохранять все данные _POST, _GET, URL, а уже после, выкидывать пользователя из системы, и при повторном входе, восстанавливать их, но, в таком случае, обеим пользователям может, понадобится набирать логин и пароль каждый раз при обновлении или переходе на другую страницу.
3. Самый правильный, на мой взгляд, и самый тяжелый в реализации способ – не пускать Сидорова в систему, пока с ней не закончил работать Иванов. При входе Иванова – скрипт запускает сессию, с идентификатором Иванова, чтобы при наличии данного идентификатора не запускать аутентификацию каждый раз, как пользователь перешел на другую страницу. Также в БД сохраняется информация, о том, какой пользователь вошел в систему, и дата/время его последней активности. Если Сидоров, попытается войти, пока информация об активности Иванова находится в БД – Сидорову будет отказано в доступе, но вот как следить за активностью Иванова?
Один из известных способов – ротация БД активных пользователей, по времени: каждый раз, при попытке входа любого пользователя в систему (или по крону) проверять, сколько времени прошло с последней зафиксированной активности пользователя, и если, например, это время более 1-го часа – удалять эту запись. Тогда, если Сидоров пытается зайти в систему, спустя 1 час 1 минуту, со времени последней активности Иванова, скрипт авторизации пускает Сидорова и выкидывает Иванова. Но появившийся спустя 2 часа Иванов уже не сможет зайти в систему. Этот вариант практически сходен со 2-ым способом, только с добавлением задержки по времени. Но помимо этого существует еще 1 минус: если Иванов, не вышел из системы, путем нажатия кнопки «Выход», а просто закрыл браузер (перегрузился компьютер и т.п.) то войти повторно, он сможет только, по прошествии 1-го часа, с момента его последней активности! Если он попытается зайти со своего же компьютера – можно реализовать запоминание его по Кукису, но что если вход будет выполняться с другого ПК?
Вот здесь и проявляется минус клиент-серверной архитектуры. Ведь если бы скрипт ПХП мог «знать» - открыт или закрыт браузер у клиента – то проблема решалась бы достаточно просто: браузер с авторизированным доступом открыт – пользователь активен, закрыт – не активен. Но как узнать, о состоянии браузера у клиента – по-моему, в этом случае, может помочь только JavaScript?
Просьба поделится методами решения данной проблемы или информацией о том, где можно прочесть об этом.
Как реализовать метод проверки, не реже 1 раза в 10 сек., открыта ли страница с авторизированым доступом у клиента?
Ситуация: есть 1 учетная запись: логин: test, пароль: test. Пользователь Иванов зашел в систему под логином test, а через 5 минут пользователь Сидоров также пытается зайти под тем же логином. Как запрограммировать скрипт для таких случаев?
1. Самый простой вариант – пустить пользователя Сидоров в систему, оставив там же Иванова, но в таком случае, нарушается основополагающая концепция авторизации: каждый пользователь имеет свой уникальный логин. Также, нельзя будет с уверенностью сказать, кто именно, из этих пользователей произвел действия, записанные на логин test? Да и могут возникнуть некоторые серьезные коллизии в разделах, чувствительных к одновременному присутствию нескольких одинаковых логинов.
2. Вариант, немного сложнее первого – «выкинуть» пользователя Иванов из системы, сразу перед тем, как пустить Сидорова. Но в этом случае, может произойти потеря данных у Иванова: набрав в форме <textarea> грандиозное сочинение и нажав кнопку «Submit», он может обнаружить форму для ввода логина и пароля, вместо сообщения: «Ваше сообщение успешно сохранено». Можно, конечно, сохранять все данные _POST, _GET, URL, а уже после, выкидывать пользователя из системы, и при повторном входе, восстанавливать их, но, в таком случае, обеим пользователям может, понадобится набирать логин и пароль каждый раз при обновлении или переходе на другую страницу.
3. Самый правильный, на мой взгляд, и самый тяжелый в реализации способ – не пускать Сидорова в систему, пока с ней не закончил работать Иванов. При входе Иванова – скрипт запускает сессию, с идентификатором Иванова, чтобы при наличии данного идентификатора не запускать аутентификацию каждый раз, как пользователь перешел на другую страницу. Также в БД сохраняется информация, о том, какой пользователь вошел в систему, и дата/время его последней активности. Если Сидоров, попытается войти, пока информация об активности Иванова находится в БД – Сидорову будет отказано в доступе, но вот как следить за активностью Иванова?
Один из известных способов – ротация БД активных пользователей, по времени: каждый раз, при попытке входа любого пользователя в систему (или по крону) проверять, сколько времени прошло с последней зафиксированной активности пользователя, и если, например, это время более 1-го часа – удалять эту запись. Тогда, если Сидоров пытается зайти в систему, спустя 1 час 1 минуту, со времени последней активности Иванова, скрипт авторизации пускает Сидорова и выкидывает Иванова. Но появившийся спустя 2 часа Иванов уже не сможет зайти в систему. Этот вариант практически сходен со 2-ым способом, только с добавлением задержки по времени. Но помимо этого существует еще 1 минус: если Иванов, не вышел из системы, путем нажатия кнопки «Выход», а просто закрыл браузер (перегрузился компьютер и т.п.) то войти повторно, он сможет только, по прошествии 1-го часа, с момента его последней активности! Если он попытается зайти со своего же компьютера – можно реализовать запоминание его по Кукису, но что если вход будет выполняться с другого ПК?
Вот здесь и проявляется минус клиент-серверной архитектуры. Ведь если бы скрипт ПХП мог «знать» - открыт или закрыт браузер у клиента – то проблема решалась бы достаточно просто: браузер с авторизированным доступом открыт – пользователь активен, закрыт – не активен. Но как узнать, о состоянии браузера у клиента – по-моему, в этом случае, может помочь только JavaScript?
Просьба поделится методами решения данной проблемы или информацией о том, где можно прочесть об этом.
Как реализовать метод проверки, не реже 1 раза в 10 сек., открыта ли страница с авторизированым доступом у клиента?