Подскажите мне пожалуйста, как правильно решать следующую задачу:
Я сделала авторизацию на сайте для двух пользователей, но работать они будут с одним приложением.
Как правильно сделать так, что пока один вносит изменения, другой не мог авторизоваться(?) или не мог вносить изменения?
Спустя 9 минут, 26 секунд (17.05.2011 - 07:11) inpost написал(а):
Храни поле `lastactive`, и второй не может делать, пока есть первый пользователь, у которого `lastactive` < 3 min , при этом раз в минуту аяксом дёргай БД и обновляй это поле + обновляй при переходе между страницами.
А с приоритетами, если предыдущий пользователь отсутствовал более 3-х минут, то второму пользователю приоритет делаешь MAX(`priority`)+1, или 1, а остальным 0 через case: when then when then, конструкцию эту можно подсмотреть на конкурсе последнем в некоторых работах (6,22,Николая). Ну а если всего 2 пользователя, то вообще менять не составит проблему приоритет с одного на второго.
А с приоритетами, если предыдущий пользователь отсутствовал более 3-х минут, то второму пользователю приоритет делаешь MAX(`priority`)+1, или 1, а остальным 0 через case: when then when then, конструкцию эту можно подсмотреть на конкурсе последнем в некоторых работах (6,22,Николая). Ну а если всего 2 пользователя, то вообще менять не составит проблему приоритет с одного на второго.
Спустя 1 час, 32 минуты, 35 секунд (17.05.2011 - 08:43) linker написал(а):
zvezda_t
Есть два варианта, первый - в таблицу добавить поле статуса modifie, типа 0 - свободно, 1 - занято. Соответственно если 1, то данную запись уже кто-то правит, а значит не давать её открыть повторно другим юзверем.
Второй вариант, рисуется таблица, в которой добавляются поля: тип объекта(таблица или тупо: новость, статья и т.п.), id объекта, id пользователя который правит объект данный объект. Когда пользователь пытается открыть на правку какой-то объект, делается проверка в этой таблице по id и типу, если запись есть, то не давать открыть. Вопросы, если не понятно что-то.
Есть два варианта, первый - в таблицу добавить поле статуса modifie, типа 0 - свободно, 1 - занято. Соответственно если 1, то данную запись уже кто-то правит, а значит не давать её открыть повторно другим юзверем.
Второй вариант, рисуется таблица, в которой добавляются поля: тип объекта(таблица или тупо: новость, статья и т.п.), id объекта, id пользователя который правит объект данный объект. Когда пользователь пытается открыть на правку какой-то объект, делается проверка в этой таблице по id и типу, если запись есть, то не давать открыть. Вопросы, если не понятно что-то.
Спустя 10 минут, 38 секунд (17.05.2011 - 08:54) kirik написал(а):
linker
Если юзер, который первый открыл документ просто закроет браузер - после этого уже никто не сможет открыть этот документ.
Если юзер, который первый открыл документ просто закроет браузер - после этого уже никто не сможет открыть этот документ.
Спустя 8 минут, 56 секунд (17.05.2011 - 09:03) linker написал(а):
kirik
Ну почему же, если выбран второй вариант, то запись в таблице редактируемых объектов останется. А значит можно всего лишь проверить соответствие id пользователя в таблице и id пользователя открывающего на редактирование. Если совпадает, то дать открыть. Тут ещё можно кучу проверок придумать, например удалять все записи для пользователя с id из таблицы при авторизации. Или хандлер на сессию повесить, чтобы удалял всё нужное из таблицы при уничтожении сессии.
У нас в издательской системе реализовано именно так, зато видно какой документ редактируется, кем, когда открыт, сколько в работе, с какого ипа, каким юзверем и т.д.
Ну почему же, если выбран второй вариант, то запись в таблице редактируемых объектов останется. А значит можно всего лишь проверить соответствие id пользователя в таблице и id пользователя открывающего на редактирование. Если совпадает, то дать открыть. Тут ещё можно кучу проверок придумать, например удалять все записи для пользователя с id из таблицы при авторизации. Или хандлер на сессию повесить, чтобы удалял всё нужное из таблицы при уничтожении сессии.
У нас в издательской системе реализовано именно так, зато видно какой документ редактируется, кем, когда открыт, сколько в работе, с какого ипа, каким юзверем и т.д.
Спустя 24 минуты, 16 секунд (17.05.2011 - 09:27) kirik написал(а):
linker
А что будет если второй юзер попытается открыть документ, после того как первый юзер уже закрыл браузер, или ушел с этой страницы? Как отследить это событие?
А что будет если второй юзер попытается открыть документ, после того как первый юзер уже закрыл браузер, или ушел с этой страницы? Как отследить это событие?
Спустя 5 минут, 48 секунд (17.05.2011 - 09:33) linker написал(а):
Сессия уничтожается, уничтожается и запись о том, что документ заблокирован, это же логично.
Спустя 14 минут, 22 секунды (17.05.2011 - 09:47) kirik написал(а):
Цитата (linker @ 17.05.2011 - 02:33) |
Сессия уничтожается, уничтожается и запись о том, что документ заблокирован, это же логично. |
А, сори.. пропустил про сессию. Как-то это сложно получается Тогда сессию нужно поддерживать живой в процессе редактирования документа (на случай если редактирование займёт больше чем время жизни сессии). А значит вариант inpost'а ничем не отличается, но он проще в реализации, т.к. не нужно привязывать к сессионному сборщику мусора левое действие.
Я не критикую, просто рассуждаю так вслух Была такая задача как-то, решил как inpost, но ведь это так костыльно выглядит... Это я наверное после AS с его NetConnection с другой стороны взглянул. Замутить-бы что-нибудь с долговременным ajax соединением, чтобы всё в режиме реального времени происходило..
Спустя 16 минут, 40 секунд (17.05.2011 - 10:04) linker написал(а):
Ну у нас система не простая, нам очень важен контроль. Плюс есть варианты, что открыть на просмотр можно и т.д. Отчеты, кто сколько проработал, какой материал сколько пролежал в работе и т.д. Всё это учитывается и если ты прошляпил, закрыл браузер и т.п., то это твои проблемы. Вся работа on-line. Я просто рассказал, как реализовано у меня, а Звезда пускай сама выбирает, что ей лучше под свои нужды.
Спустя 3 часа, 31 минута, 52 секунды (17.05.2011 - 13:36) zvezda_t написал(а):
Цитата (linker @ 17.05.2011 - 12:33) |
Сессия уничтожается, уничтожается и запись о том, что документ заблокирован, это же логично. |
А как это реализовать?
Спустя 43 минуты, 27 секунд (17.05.2011 - 14:19) linker написал(а):
Спустя 17 часов, 14 минут, 28 секунд (18.05.2011 - 07:34) zvezda_t написал(а):
Цитата |
, при этом раз в минуту аяксом дёргай БД и обновляй это поле |
inpost, а на основании чего обновлять? изменились ли записи в БД?
тогда можно в БД тригер написать, при изменении таких то таблиц, таким то пользователем - переписывать дату для lastactive.
или не так?
Цитата |
Тогда сессию нужно поддерживать живой в процессе редактирования документа (на случай если редактирование займёт больше чем время жизни сессии). |
Как это сделать?
Цитата |
Есть два варианта, первый - в таблицу добавить поле статуса modifie, типа 0 - свободно, 1 - занято. Соответственно если 1, то данную запись уже кто-то правит, а значит не давать её открыть повторно другим юзверем. Второй вариант, рисуется таблица, в которой добавляются поля: тип объекта(таблица или тупо: новость, статья и т.п.), id объекта, id пользователя который правит объект данный объект. Когда пользователь пытается открыть на правку какой-то объект, делается проверка в этой таблице по id и типу, если запись есть, то не давать открыть. Вопросы, если не понятно что-то. |
Есть вопросы
linker, перешла по ссылке, насколько я поняла, можно сделать так:
В моём случае если пользователь вошел в систему для работы с приложением, то он может создать операцию на определённое число, и если другой пользователь попытается также создать такую же операцию (пусть со временем чуть позже), будет не очень хорошо.
Поэтому я думаю, лучше блокировать их на моменте входа в систему.
Если один пользователь уже работает с операциями, второй авторизоваться не может.
Например в таблице users я создам поле block, при авторизации первого пользователя ставлю метку 1, значит второй не может войти.
Теперь как мне узнать когда снять метку.
Если при закрытии сессии? (Я так понимаю что данный метод работает и при закрытии браузера?)
Получается мне нужно в функцию срабатываемую, при закрытии сессии(destroy($id) - или эта функция сама не срабатывает? её вызывать нужно?) записать запрос, который полю block поставит значение =0, для данного пользователя(?)( а как мы его айдишник узнаем? сессия же уже мертва? или мы всем пользователем поставим block=0) так или не правильно?
Спустя 35 минут, 15 секунд (18.05.2011 - 08:09) inpost написал(а):
zvezda_t
Если человек на сайте сидит, значит поле lastactive=NOW() раз в минуту. Зашел другой человек, проверил lastactive -10min, если нет активности - значит этому можно сидеть на сайте
Если человек на сайте сидит, значит поле lastactive=NOW() раз в минуту. Зашел другой человек, проверил lastactive -10min, если нет активности - значит этому можно сидеть на сайте
Спустя 20 минут, 23 секунды (18.05.2011 - 08:29) zvezda_t написал(а):
Цитата |
Если человек на сайте сидит, значит поле lastactive=NOW() раз в минуту. |
"Если человек на сайте сидит"-определяется по существованию сессии?
Спустя 6 минут, 4 секунды (18.05.2011 - 08:35) linker написал(а):
Слушай inpost'a.
Спустя 48 минут, 35 секунд (18.05.2011 - 09:24) inpost написал(а):
zvezda_t
По моему способу сессия вообще не нужна для данной процедуры =) Идентифицировать пользователя можно и без сессии.
По пунктам:
Проверяешь, авторизирован ли пользователь, если да, то обновляешь в БД ячейку пользователя с datetime , по имени lastactive. Так же для авторизированный пользователей аяксом раз в минуту обновляешь для данного пользователя этот параметр.
Теперь разграничиваем права: если данный пользователь пришел, когда другой пользователь уже находился активным (а это поле lastactive) у другого пользователя обновлялось последние 10 минут, значит в БД помечаешь, что данный пользователь является второстепенным, если последние 10 минут записей 0 активных пользователей - то данный пользователь становится активным, и тогда другие пользователи будут его ждать.
И последнее, четко разграничивай, кто активный, кто ждут. Можешь как-то выделять того в БД, кто на данный момент работает. А проверка такая: SELECT * FROM `table` WHERE `lastactive`>NOW()-10 AND `active`='YES', если возвращается >0, значит кто-то сейчас на сайте сидит, если нет - значит данного пользователя записываешь как active и ставишь дату lastactive, а всем другим пользователям active='NO'. В таком духе.
По моему способу сессия вообще не нужна для данной процедуры =) Идентифицировать пользователя можно и без сессии.
По пунктам:
Проверяешь, авторизирован ли пользователь, если да, то обновляешь в БД ячейку пользователя с datetime , по имени lastactive. Так же для авторизированный пользователей аяксом раз в минуту обновляешь для данного пользователя этот параметр.
Теперь разграничиваем права: если данный пользователь пришел, когда другой пользователь уже находился активным (а это поле lastactive) у другого пользователя обновлялось последние 10 минут, значит в БД помечаешь, что данный пользователь является второстепенным, если последние 10 минут записей 0 активных пользователей - то данный пользователь становится активным, и тогда другие пользователи будут его ждать.
И последнее, четко разграничивай, кто активный, кто ждут. Можешь как-то выделять того в БД, кто на данный момент работает. А проверка такая: SELECT * FROM `table` WHERE `lastactive`>NOW()-10 AND `active`='YES', если возвращается >0, значит кто-то сейчас на сайте сидит, если нет - значит данного пользователя записываешь как active и ставишь дату lastactive, а всем другим пользователям active='NO'. В таком духе.
Спустя 4 дня, 23 часа, 18 минут, 34 секунды (23.05.2011 - 08:42) zvezda_t написал(а):
inpost я запуталась
Цитата |
По моему способу сессия вообще не нужна для данной процедуры =) Идентифицировать пользователя можно и без сессии. |
Цитата |
По пунктам: Проверяешь, авторизирован ли пользователь, |
Как определить, авторизован ли, ты ответил:
Цитата |
Наличие сессии, обычно, что пользователь авторизирован. Всё это делается из страниц, по которым ходит данный пользователь. |
Так как же так? Всё таки с сессией или нет? объясни пожалуйста
_____________
Что ты сделал сегодня - для завтра?
"Приидите ко Мне вси труждающиеся и обремененнии и Аз упокою вы, возмите иго Мое на себе и научитеся от Мене яко кроток есмь и смирен сердцем и обрящете покой душам вашим, иго бо Мое благо и бремя Мое легко есть."(Мф. 11:28-30)