Проверка повторного входа


Внешняя обработка для недопущения повторного входа пользователя.

Не секрет, что в БП и ЗУП отсутствует механизм недопущения повторного входа в программу одного и того же пользователя.

Существующие рекомендации в интернете предлагают вносить изменения в общий модуль, но это не наш путь. Гораздо проще, в плане обновлений, сделать это внешней обработкой.

Однако, изменения в конфигурацию всё же придётся внести — для пользователей без административных прав предлагается добавить новую роль «ПроверкаПовторногоВхода» в которой нужно установить разрешения Активные пользователи и т.д. (см. картинку).

Эти изменения нужно внести для всех информационных баз на сервере, т.к. обработка будет запускаться для всех них.

После этого нужно изменить ярлык запуска программы. Необходимо дописать в конец строки «Объект»

/Execute»C:ПутьКОбработкеПроверкаПовторногоВхода83.epf»

Должно получится примерно следующее:

«C:Program Files (x86)1cv8common1cestart.exe» /Execute»C:UsersПроверкаПовторногоВхода83.epf»

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

 

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

Если пользователь запустил единственную копию базы, то никаких форм не открывается, однако в интерфейсе такси в заголовке будет написано «Проверка повторного входа».

Обработка работает и под обычные формы и под управляемые, что удобно, когда например на одном сервере БП 3 и ЗУП 2.5.

6 Comments

  1. slazzy

    Решение с запуском внешней обработки очень ненадежно во всех смыслах 🙂 лучше всё таки так не делать. К тому же код обработки, я полагаю не сложен, и его вполне можно внести в дополнительный новый модуль.

    Reply
  2. kapustinag

    Кроме того, если «…автоматически завершится, к сожалению, без предупреждения…» — если предупреждение действительно хочется сделать, то непонятно, почему бы его не сделать — в обработчике При Открытии формы. Во всяком случае, в толстом клиенте это 100% работает.

    А с (1) полностью согласен. И конфигурацию пришлось менять, и внешнюю обработку задействовать, и ярлык после обновления заменять… Как-то неуклюже.

    Reply
  3. iodine

    (1) slazzy, ненадежно? Однако ж уже работает более полугода.

    Reply
  4. iodine

    (2) kapustinag, если поставить предупреждение, то оно будет висеть, пока пользователь его не закроет, а пока программа запущена — 1 лицензия занята. Может быть можно сделать как-то так, чтобы программа закрывалась, а сообщение оставалось на экране. Или фокус уходил на уже запущенный вариант. Как это сделать я не знаю, поэтому без предупреждений.

    По поводу изменений, это минимальные изменения. Добавить новую роль, это не лезть в общие модули, да даже если в них и лезть, то всё равно придётся добавлять роль. У меня в любом случае есть несколько действий после обновления платформы, так что ещё одно по замене ярлыка, которое занимает секунды погоды не делает.

    Впрочем, у каждого своё видение как сделать проще — у меня такое.

    К тому же есть на сервере несколько баз, то в какую-то можно забыть добавить такую проверку и она работать не будет, а это решение сразу для всех баз. Забыли доавить роль — будет выскакивать сообщение.

    Reply
  5. slazzy

    (3) да. Во-первых с точки зрения безопасности, нету никакой гарантии того, что какой-нибудь нехороший человек не положит по адресу C:UsersПроверкаПовторногоВхода83.epf другую обработку, которая скажем возьмет все ваши данные и отошлет ему на почту, или просто удалит. Да и вообще вы даете пользователям право запускать внешние обработки, что может быть чревато.

    Во-вторых нету никакой гарантии, что случайно не удалится эта обработка, а уж тем более с диска C. В-третьих, как и сказал (2) вы всё равно изменили конфигурацию. Я не знаю какой код в Вашей обработке, я не качал. Но лично я тренировки ради сделал подобное решение примерно в 10 строках кода, без добавления лишних объектов. Сделал за пару минут, вероятно это далеко не самое оптимальное решение, но оно работает.

    ЗЫ В тонком клиенте пришлось бы вызывать сервер. Либо изменять 2 модуля, например в модуле сеанса проверять возможность запуска и передавать результат через ПараметрыСеанса, а в модуле управляемого приложения уже проверять значение этого параметра сеанса.

    Процедура ПередНачаломРаботыСистемы(Отказ)
    ////////
    //стандартный код
    //////
    МассивСоединений = ПолучитьСоединенияИнформационнойБазы();
    НомерСеанса = НомерСеансаИнформационнойБазы();
    Для Каждого Соединение из МассивСоединений Цикл
    
    Если Соединение.НомерСеанса = НомерСеанса Тогда
    Продолжить;
    КонецЕсли;
    
    Если Соединение.Пользователь.УникальныйИдентификатор = ПользователиИнформационнойБазы.ТекущийПользователь().УникальныйИдентификатор
    И Соединение.ИмяПриложения = «1CV8» Тогда
    Отказ = Истина;
    КонецЕсли;
    КонецЦикла;
    КонецПроцедуры
    

    Показать

    Если вам так дорога эта обработка, встройте вы её в конфигурацию и вызывайте в модуле управляемого приложения через серверный вызов.

    Reply
  6. iodine

    (5) slazzy, спасибо, что тратите ваше время, на обсуждение этой обработки. Постараюсь ответить на ваши замечания.

    По поводу безопасности — это всё решается на уровне разграничения прав доступа к файлам. Если у вас нет административного доступа к серверу или этот доступ есть у кого-то ещё, особенно у «нехороших» людей, то этот способ, конечно, не подходит. Тоже самое касается удаления файла. К тому же, если файл обработки вдруг исчезнет, все пользователи будут получать сообщение об ошибке при запуске программы. Некоторые даже скажут программисту об этом 😉

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

    Как я понял, вы предлагаете вносить изменения в модуль обычного и в 2 модуля управляемого приложения (в зависимости от конфигурации). А это ведёт к постоянному контролю изменений в этих модулях при обновлении конфигурации. И это нужно будет сделать для каждой конфигурации на сервере, а если их, например, десяток-другой. Во сколько раз увеличивается время на установку обновлений?

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

    Подводя итог, хочу сказать, что если вы приходящий программист, а есть ещё администратор сервера, то мой способ — не самое лучшее решение. В случае возникновения проблем сложно будет найти и доказать чья вина. К тому же, при почасовой оплате выгоднее подольше обновлять конфигурацию каждый раз.

    Ну, а если сервер полностью в вашей власти и вам нужно как можно меньше времени тратить на обновление конфигураций, то мой способ вполне подойдёт. Ещё раз повторю, этот вариант рабочий и используется уже больше полугода.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *