Блокировка одновременного доступа боле 1-го пользователя с 1 учетной записи.

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 сек., открыта ли страница с авторизированым доступом у клиента?
 

AmdY

Пью пиво
Команда форума
имхо, нужно либо разрешать быть отновременно нескольким пользователям, либо при входе нового убивать старого. для этого достаточно завести поле в котором хранить sid для пользователя
 

Фанат

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

не выпендривайся и делай 2
 

Royal Flash

-=MaestrO=-
*****
Да, согласен, но всетаки третий вариант, выглядит правильнее, если решить вопрос с жалобами...
 

iceman

говнокодер
какая тебе разница кто за этой учеткой сидит Вася или Петя? тебе должно быть всеравно кто залогинился, для тебя есть учетная запись с ней и работай, о другом не думай...
 

tashkentchi

Новичок
Re: Блокировка одновременного доступа боле 1-го пользователя с 1 учетной записи.

Автор оригинала: Royal Flash
основополагающая концепция авторизации: каждый пользователь имеет свой уникальный логин.
С чего бы это она стала основополагающей? Люди - одно, акаунты - другое. Никакие однозначные соответствия не предполагаются.
 

Royal Flash

-=MaestrO=-
tashkentchi
Перефразирую: "Основополагающая концепция авторизации, для проектов, требующих повышеного внимания к идетификации пользователя (платные услуги и т.п.): каждый пользователь имеет свой уникальный логин."

iceman
Если бы не было - я бы не спрашивал.
 

x-yuri

Новичок
Самый простой вариант – пустить пользователя Сидоров в систему, оставив там же Иванова, но в таком случае, нарушается основополагающая концепция авторизации: каждый пользователь имеет свой уникальный логин. Также, нельзя будет с уверенностью сказать, кто именно, из этих пользователей произвел действия, записанные на логин test
сначала говоришь один пользователь - один логин, потом два пользователя - один логин. Я чего-то не понял?

Вариант, немного сложнее первого – «выкинуть» пользователя Иванов из системы, сразу перед тем, как пустить Сидорова
это может быть один и тот же человек, просто за разными компьютерами/браузерами

Но в этом случае, может произойти потеря данных у Иванова: набрав в форме <textarea> грандиозное сочинение и нажав кнопку «Submit», он может обнаружить форму для ввода логина и пароля, вместо сообщения: «Ваше сообщение успешно сохранено». Можно, конечно, сохранять все данные _POST, _GET, URL, а уже после, выкидывать пользователя из системы, и при повторном входе, восстанавливать их, но, в таком случае, обеим пользователям может, понадобится набирать логин и пароль каждый раз при обновлении или переходе на другую страницу
а что с _POST, _GET, URL будет, когда сайт должен их предоставить, если он не может различить этих двух людей?
 

iceman

говнокодер
Самый простой вариант – пустить пользователя Сидоров в систему, оставив там же Иванова, но в таком случае, нарушается основополагающая концепция авторизации: каждый пользователь имеет свой уникальный логин.
ну так и есть, каждый пользователь имеет свой аккуант, но это не значит что каждый человек имеет свой акк, да и ты не можешь узнать человек за этим компьютером или обезьянка =)

Если бы не было - я бы не спрашивал.
я тебя не спрашивал, я тебе утверждаю что для тебя разницы не должно быть...
 

Royal Flash

-=MaestrO=-
x-yuri
1 пользователь 1 логин - это идеал, к которому нужно стремится. Понятно, что этого добится тяжело, но по максимуму усложнить жизнь недобросовестным пользователям просто необходимо. Да и средства для этого должны быть адекватные - сканирование отпечатков пальцев и сетчатки я не расматриваю :)

Один человек - безусловно может находится за разными компьютерами. Если ты внимательно прочитаеш мой пост - то там этот момент учтен.

Скриптам сайта, как раз, всеравно, кто зашел: Иванов или Сидоров. При заходе Сидорова, с данными Иванова ничего не происходит. Все _POST, _GET, URL записываются только тогда, когда Иванова выкидывает из системы. А восстанавливаются они только при повторном логине test в систему.

iceman
Что мне нужно, а что нет, это я уже как-нибуть сам решу - мой опыт позволяет это сделать.
________________________________________________


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

Просьба свои мнения, подкреплять доводами, а не разводить демагогию.
 

Фанат

oncle terrible
Команда форума
Я вообще не понимаю, какая разница, сколько аккаунтов. Кому какое до этого дело?
Ясно, что подразумевается один человек - один логин.

Аффтар, у тебя какя стоит задача? Отсекать двойников или обслуживать у них вприсядку?
 

iceman

говнокодер
ну а если "1 пользователь" завел 5 учетных записей, это идеал?
 

pilot911

Новичок
вообще, задача интересная, мне кажется, должна осуществляться идиома: "один аккаунт-один пользователь онлайн"

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

это очень правильно, однако, мало кто заморачивается подобной темой
 

Духовность™

Продвинутый новичок
1 пользователь 1 логин - это идеал, к которому нужно стремится. Понятно, что этого добится тяжело, но по максимуму усложнить жизнь недобросовестным пользователям просто необходимо.
добросовестность никак не связана с количеством аккаунтов. у меня в ЖЖ 2 аккаунта было - один вещал от имени сайта (ru_server_com) преимущественно анонсы по сообществам, другой был чисто мой (vasya_pupkin) личный. Имею на подобное поведение полное право.
 

pilot911

Новичок
Автор оригинала: triumvirat
добросовестность никак не связана с количеством аккаунтов. у меня в ЖЖ 2 аккаунта было - один вещал от имени сайта (ru_server_com) преимущественно анонсы по сообществам, другой был чисто мой (vasya_pupkin) личный. Имею на подобное поведение полное право.
речь немного не о том, как я понял

тема о попытке хождения в системе двух разных людей одновременно с одинаковыми логинами
 

john.brown

просто кулибин
Royal Flash
имхо, ты несколько противоречишь сам себе - с одной стороны говоришь, что 1 логин - 1 пользователь, а с другой начинаешь париться по поводу какого-то левого сидорова с тем же логином, что у иванова. а ведь однозначно сидоров спер логин иванова, и пущать его туда нельзя ни под каким соусом, независимо, открыта сессия иванова или нет. это, имхо, можно реализовать токмо еще дополнительной авторизацией по какой то карточке с кодами, из которой запрашивается ввести какой то случайно выбранный. естественно не 100% страховка...
или все же у тебя могут быть несколько пользователей с одним логином, но входить могут токмо по очереди - это другая история. тогда почему бы и не посылать раз в 10 сек аякс запрос, подтверждающий что страница открыта? если уж такая точность нужна...
 

Фанат

oncle terrible
Команда форума
имхо, ты несколько противоречишь сам себе - с одной стороны говоришь, что 1 логин - 1 пользователь, а с другой начинаешь париться по поводу какого-то левого сидорова с тем же логином, что у иванова.
+500, если поправить орфографию
 
Сверху