Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?

Официальный форум Simple-Scada.

Автор Тема: Узнать, залогинен ли пользователь  (Прочитано 317 раз)

ARV

  • Пользователь
  • **
  • Сообщений: 53
    • Просмотр профиля
Узнать, залогинен ли пользователь
« : 13 Сентября 2024, 12:03:01 »
Как узнать на "этом" клиенте, вошел ли пользователь "Админ" (условно) на другом (не "этом") клиенте?

Для чего это нужно: поскольку нет никакой возможности гарантировать, что при работе с "внутренней" (т.е. не-OPC-шной) переменной другой пользователь с такими же привилегиями на другом клиенте не запорет её содержимое, хочу в критических моментах выводить предупредительное окно о том, что-то кто-то с такими правами уже залогинился и работать нельзя.

P.S. "Внутрення" переменная (внутренний тег) - это какой-то нонсенс, если она на самом деле публичная. Это даже не валенки в сенях, которые может кто угодно надеть и выйти на мороз, так как эти "валенки" чудесным образом могут с ваших ног исчезнуть, если еще кто-то пожелает их надеть, и вы останетесь на морозе босиком.

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

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3066
    • Просмотр профиля
    • Simple-Scada
Re: Узнать, залогинен ли пользователь
« Ответ #1 : 13 Сентября 2024, 16:31:11 »
Цитировать
Для чего это нужно: поскольку нет никакой возможности гарантировать, что при работе с "внутренней" (т.е. не-OPC-шной) переменной другой пользователь с такими же...
Сейчас для этого нужно делать отдельную страницу/окно, доступную только одному пользователю и запретить множественную авторизацию.
В одном из ближайших обновлений можно будет использовать окна как формы ввода. Тогда при открытии будет создаваться копия окна на каждом клиенте и на неё нельзя будет повлиять извне. После заполнения формы можно будет отправить данные из компонентов в окне на сервер и выполнить с ними нужные действия. Возможно успеем включить формы ввода в ближайшее обновление.

Цитировать
"Внутрення" переменная (внутренний тег) - это какой-то нонсенс, если она на самом деле публичная.
Как мы уже неоднократно писали: у клиентов нет отдельных переменных. То же касается скриптов, объектов, окон, сообщений. Клиенты только подключаются к проекту на сервере и работают с объектами проекта к которым у них есть доступ. Если Вы привязали к полю переменную, то любой пользователь, который имеет к нему доступ, сможет изменить значение переменной (внутренней, либо внешней) через поле. Все типы переменных и разница между ними описаны в руководстве по ссылке.

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

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

ARV

  • Пользователь
  • **
  • Сообщений: 53
    • Просмотр профиля
Re: Узнать, залогинен ли пользователь
« Ответ #2 : 13 Сентября 2024, 16:48:40 »
Я действительно многого не понимаю.

Например, пришлось отказаться от возможности изменения данных в таблице с немедленным (т.е. по факту изменения ячейки) обновлением базы данных, т.к. не реализовано событие по изменению содержимого ячейки таблицы, зато реализовано значение по изменению привязанной к ячейке переменной. Интересно получается: заполняется таблица единым запросом, а привязка переменных должна потом делаться каким-то левым образом?

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

И как быть?! Получается, ни один клиент не может сделать что-то своё?! Конфиликты на уровне базы данных решает сама база, а конфликты уровня СКАДА не решает никто. Т.е. на двух клиентах с моим подходом невозможно изменить две РАЗНЫЕ ячейки одной и той же таблицы!

И решения не предлагается, дескать, невозможно будет работать. А сейчас, получается, возможно...

Одно пока утешает: доступ к изменению базы есть только у условного админа, а он с разных клиентов в принципе зайти не может одновременно. Да и запрет на множественный логин тоже спасает. Но ведь это явно кривое решение!

Окна ввода проблему с таблицей решат вряд ли, т.к. редактировать ячейки при помощи отдельных окон то еще удовольствие!

Имхо, на клиенте должна быть возможность создания и хранения исключительно локальных, клиентских переменных. Клиент записал в переменную ссылку на реальную OPC-шную, и работает с ней, как желает. Другой клиент создаст проблему только в том случае, если в свою локальную запишет ссылку на ту же самую ОРС-переменную, но вероятность одновременного доступа к одному и тому же мала, и ничем не отличается от нынешней ситуации. Зато на разных клиентах можно будет одним и тем же универсальным скриптом делать РАЗНОЕ.

Разве этот подход несет какие-то новые риски?! Где тут усложнение разработки? Какие могут быть последствия в этом случае, которых не может быть в нынешнем состоянии?

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3066
    • Просмотр профиля
    • Simple-Scada
Re: Узнать, залогинен ли пользователь
« Ответ #3 : 13 Сентября 2024, 17:36:46 »
Цитировать
Например, пришлось отказаться от возможности изменения данных в таблице с немедленным (т.е. по факту изменения ячейки) обновлением базы данных, т.к. не реализовано событие по изменению содержимого ячейки таблицы
Событие ввода в ячейки (OnDoneInput) можно добавить, если это подходит под Вашу задачу, это отдельный вопрос.

Цитировать
Имхо, на клиенте должна быть возможность создания и хранения исключительно локальных, клиентских переменных. Клиент записал в переменную ссылку на реальную OPC-шную, и работает с ней, как желает. Другой клиент создаст проблему только в том случае, если в свою локальную запишет ссылку на ту же самую ОРС-переменную, но вероятность одновременного доступа к одному и тому же мала, и ничем не отличается от нынешней ситуации. Зато на разных клиентах можно будет одним и тем же универсальным скриптом делать РАЗНОЕ.
Чтобы внятно объяснить почему это не будет работать нужно написать диссертацию о связи данных на сервере, на клиентах и скриптах. У нас нет такой возможности и времени на это. Для создания отдельного интерфейса доступного одному пользователю см. предыдущий ответ. Какие-то новые способы (кроме форм для ввода) скорее всего не появятся в ближайшие годы.

Цитировать
Для чего это нужно: поскольку нет никакой возможности гарантировать, что при работе с "внутренней" (т.е. не-OPC-шной) переменной другой пользователь с такими же привилегиями на другом клиенте не запорет её содержимое, хочу в критических моментах выводить предупредительное окно о том, что-то кто-то с такими правами уже залогинился и работать нельзя.
Важное уточнение: при работе с одним (!) отдельным не связанным с другими полем / ячейкой таблицы / уровнем / флажком разные клиенты не могут помешать друг другу. Допустим два клиента начали вводить данные в одно поле. Первый ввёл 25, значение 25 записалось в переменную. У второго ввод в поле не прервётся, фокус с поля не пропадёт, он сможет ввести любое значение, например 30. Третий клиент (если он не начал ввод в поле) увидит как значение в поле стало 25, а затем 30. Чаще всего так всё и работает, пользователи подключаются к проекту и последовательно управляют оборудованием, меняют задание/уставки и т.п. не мешая друг другу.

Проблема возникает только когда нужно использовать несколько значений в каком-то едином процессе/последовательности действий. Например: два поля и кнопка "Применить", которая считает сумму из значений двух полей. Один клиент вводит в поля значения 25, и 30 и ожидает сумму 55. Но перед нажатием кнопки "Применить" другой клиент может уже изменить значение в первом поле на 0. И первый клиент увидит, что значение в первом поле стало 0, во втором осталось 30 и после нажатия кнопки "Применить" увидит сумму равную 30. С помощью форм можно было бы выдать окно с двумя полями и после их заполнения (отдельно на каждом клиенте), посчитать сумму. А в текущих версиях нужно обязательно делать отдельную страницу/окно к которой имеет доступ один пользователь, чтобы избежать вмешательства других.

Цитировать
Окна ввода проблему с таблицей решат вряд ли, т.к. редактировать ячейки при помощи отдельных окон то еще удовольствие!
Вышеописанное касается и ввода в ячейки.

« Изменён: 13 Сентября 2024, 17:57:34 от Simple-Scada »