Система Со Своим Механизмом Входа (аутентификацией)

savl

Lotus team
28.10.2011
2 136
105
#1
Доброго времени суток
Есть задача, вот часть где есть проблема:
1. создать систему с внутренним списком сотрудников
2. сотрудники будут логиниться в базу по штрих-коду
3. при нахождении документа сотрудника по ключу (штрих-код) открывать документ.
4. авто выход сотрудника из системы (по таймеру)

Для аутентификации я использую notesUIWorkspace.Prompt с параметром PROMPT_PASSWORD.
И потом обрабатываю данные со считывателя, здесь проблем нет.
таймер тоже сделан, документ закрывается.

И вот суть проблемы: как при закрытии документа открыть notesUIWorkspace.Prompt ?
Изначально делал на PostOpen базы, но не нашел способа вызвать форму ввода данных при закрытии документа (не само это событие просто форму).
Затем решил делать через FrameSet, с отображением разных форм. И снова столкнулся с тем, что при закрытии документа форма ввода данных либо не отображается сразу, либо появляется раньше времени, либо проблемы с определением фрейма.

Возможно я не так делаю, возможно что-то упускаю. Одним словом: запутался.
Подскажите как можно это сделать, пож-та. Важны идеи или направление, в которое стоит идти.
Очень не хотелось бы уходить в web, да, на нем проще было бы сделать и примеров тут много, но рамками самого клиента было бы лучше.
 

divankin

Senjor developer
13.08.2009
182
0
#2
Длина штрихкода фиксирована?
Вам очень важно скрывать значение штрихкода? Ведь кто угодно может сфотографировать карточку и прочитать значение?
 

susinmn

Well-known member
16.10.2007
529
3
#3
Для аутентификации я использую notesUIWorkspace.Prompt с параметром PROMPT_PASSWORD.
А если использовать форму-аутентификации с полем *пароль* и открывать не в диалоге, а во фрейме?
И вот суть проблемы: как при закрытии документа открыть notesUIWorkspace.Prompt ?
При закрытии документа (м.б. save, settargetframe,...открывать форму-аутентификации).
 

savl

Lotus team
28.10.2011
2 136
105
#4
Divankin
Это не сильно важно. По факту "штрихом" может быть что угодно или то что я скажу.
susinmn
С самой формой я думал, но тогда надо программировать считыватель на определенные штрих-коды.
В частности, как один из вариантов, чтобы в конце был символ "TAB", тогда я смогу обрабатывать onChange поля ввода.
С диалогом же, особенно с prompt попроще, в поле ввода поступает информация, сразу отрабатывает "ок" и результат ввода попадает в переменную.
 

erdi

Well-known member
20.08.2008
265
17
#5
создаешь отдельную форму и на Postopen свой код
Код:
		Source.Close
Call ws.Prompt(PROMPT_PASSWORD, "Password", "Please type your password.")
--- код по поиску нужного документа----------
поле SaveOptions не забудь
при входе можешь на PostOpen базы открывать документ
Код:
	Set doc=db.CreateDocument
doc.form="open2"
Call ws.EditDocument(False, doc)
или сразу стартовый фрейм с даной формой, в таком случаи документ сам создастся

а при закрытии основного документа снова создавать данный документ
Код:
	Set doc=db.CreateDocument
doc.form="open2"
Call ws.EditDocument(False, doc)
 

savl

Lotus team
28.10.2011
2 136
105
#6
создаешь отдельную форму и на Postopen свой код
или сразу стартовый фрейм с даной формой, в таком случаи документ сам создастся
PostOpen отрабатывает до загрузки формы, значит если открывать фреймсет с этой формой, то его не будет на экране и SetTargetFrame даст ошибку. Это если открывать документ по ключу в том же фрейме.
Опять же, если сделать при закрытии документа открытие лог-формы, то диалог ввода пароля появиться раньше, чем документ закроется.
Если открывать в новой закладке, то ничего не мешает вернуться на предыдущую просто переключением вкладки, так что просто не подходит...

UPD: Ошибки SetTargetFrame не будет, просто не найдет фрейм и откроет в новой вкладке, а затем откроет уже фрейм с документом, еще один.
 

erdi

Well-known member
20.08.2008
265
17
#7
зачем тебе SetTargetFrame ?
PostOpen отрабатывает до загрузки формы,
как-раз после загрузки формы
то диалог ввода пароля появиться раньше, чем документ закроется
а ты проверял?
и вообще вот тебе тестовая бд....2 формы: 1 авторизация по паролю, другая найденный документ. пароль к этому документу - 123, все остальное вывод сообщение, отмена закрывает базу
Посмотреть вложение authorization.zip
 

Вложения

savl

Lotus team
28.10.2011
2 136
105
#8
такой пример я сделал сам,подходит в целом, не подходит по причинам требований.
зачем тебе SetTargetFrame?
Чтобы не видеть рабочую область клиента, открыта вкладка, в ней фреймсет, во вреймсете форма на которой вылезает диалог логина.
Ввод логина - загрузка в этом же фреймсете документа пользователя. Через 5-10 минут, если в документе не нажата кнопка "Сделать" (пусть так будет) документ автоматом закрывается, в этом же фрейме появляется форма, где высвечивается диалог для ввода логина ...

Если на Queryclose вешать, то все хорошо, никто не спорит. Я делал код в кнопке, которая вызывается по времени, вот тут и ошибся.
Сейчас буду переделывать, да и еще одно решение созрело, если получится отпишусь.

как-раз после загрузки формы
До загрузки формы на экран, форма на экране еще не появилась, а событие отрабатывает. Легко проверяется msgbox'ом в PO.
 

savl

Lotus team
28.10.2011
2 136
105
#9
В целом сделал, задумка удалась, именно через фреймсет и 2 формы.
Как и erdi сделал форму "логин", которая открывается во фреймсете, в свойствах базы стоит: открывать через фреймсет.
На форме "логин" выставил JS-таймер при загрузке формы, на 500 мс. Когда таймер срабатывает он нажимает невидимую кнопку на форме.
В коде кнопки код, который вызывает ws.prompt, далее вводим наш штрих-код со считывателя, находим документ и открываем его в этом же фрейме.
В нашем документе. который мы нашли есть такой же JS-таймер, который так же нажимает невидимую кнопку на форме.
В коде данной кнопки: создание временного документа по форме "логин", открытие его в нашем фрейме и закрытие документа с данными.

Вот в принципе и всё. Решение не без минусов, но полностью удовлетворяет всем текущим требованиям.
Спасибо за пример и за помощь.
 

divankin

Senjor developer
13.08.2009
182
0
#10
А можно подробнее про JS-таймер?
Как его выставить? Можно ли его выставить из LS?
В семерке это уже работает?
Невидимая кнопка - это скрытая формулой видимости, или какие-то интерфейсные ухищрения, в результате которых кнопка сливается с фоном?
Таймер точно работает ровно через 500 мс? Я уже сталкивался с тем, что NotesTimer выставленный на секунду, иногда срабатывает сразу, иногда через полсекунды, а иногда через секунду. Вот и ищу альтернативу.
 

savl

Lotus team
28.10.2011
2 136
105
#12
Divankin
вот тут брал: http://codeby.net/forum/threads/44544.html?hl...%E0%E9%EC%E5%F0 Последняя запись.
кстати пост от nvy :p

В семерке это уже работает? Должно
Невидимая кнопка Галками скрыл для всех клиентов, из поста про таймер станет ясно.
Таймер точно работает ровно через 500 мс? Сложно сказать, начало в событии onLoad.
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 601
277
#13
кнопка д.б. скрыта (без хитростей), но ей надо задать имя (в хтмл св-вах)
точность таймера под вопросом, как и вся мультитредовость в нотусне :p "оно хорошее, но почему-то хромает" © ВиниПух
 

erdi

Well-known member
20.08.2008
265
17
#14
я бы немного изменил механизм, т.к. при работе с фрейсет может возникнуть проблема с SetTargetFrame, если пользователь когда прошел авторизацию и временно начал работать с другим документом(например почта пришла и он переключился на входящее сообщение). В этом случаи все-равно надо заблокировать документ и вывести окно с авторизацией.
Для решения этой проблемы наверное подойдет использование слоев.
В слое создается форма авторизации, чтобы не программировать считыватель на спец символы, а использовать по-умолчанию Enter, для этого вешаем на поле этот код и добавляем нажатие кнопки по поиску нужного документа.
Данный слой будет отображаться при условии что некое поле "Field"="1", например. Поле "Field" будет заполняться через скрытую кнопку по истечению таймера. При этом uidoc.Refresh и uidoc.RefreshHideFormulas будут применяться к документу, даже если фокуса на этом документе нет. Для этого uidoc нужно глобально переопределить при открытии документа set uidoc=Source

вот как-то такая мысль меня посетила

А можно подробнее про JS-таймер?
link
 

savl

Lotus team
28.10.2011
2 136
105
#15
erdi
да, проблемка с возможностью переключения вкладок есть, подумаю об этом.
Система разрабатывается как имитация терминала общего доступа, так что переключение не должно быть.
Но метод автовыхода при смене вкладки и использовании ws.prompt невозможен, так как ws.prompt модально.
Как вариант - открыть данную базу в новом окне, тогда и вкладку будет некуда переключить.
 

VladSh

начинающий
Lotus team
11.12.2009
1 276
6
#16
savl
Проще выложить базу, как это сделал erdi, чем долго объяснять что к чему :(
 

savl

Lotus team
28.10.2011
2 136
105
#17
ну да) действительно)

Там один документ, введите "123" и он найдется.
Таймер стоит на 1 минуту, если карточку не трогать минуту - появиться окно логина.
Введите ***, чтобы прервать цикл. Или просто закройте карточку, которая найдется.
Большего пока не сделал.

Обновил файл
 

Вложения