Запуск функции о другого пользователя

А в Террасофте есть такая возможность как запуск функции в скрипте от другого пользователя?
Пользователю запрещено создавать продукты, но он должен иметь возможность подгружать их из 1С.
В один прекрасный момент, когда все таки кнопка импорта из 1С пригодилась, выяснилось, что он не имеет право создавать новые продукты (почему-то этого очевидного факта я не предусмотрел). Так вот, хотелось бы запустить от имени другого пользователя.
Предполагается два костыля:
1) дать им ярлык на подобии как тут. Но пользователи шустрые и любят полазить, а там логин и пароль в незашиврованном виде. Подсмотрел, входи, твори, что хочешь. (поэтому отбрасываем этот вариант)
2) на BeforePost продуктов дать право добавлять продукт, на AfterPost убрать это право (пока не пробовал, потому что звучит как-то уж костыльно)
Что делать? Кто виноват?

Нравится

13 комментариев

если бы можно было запустить интеграцию в виде процедуры...

еще вариант - создать новое представление без учета прав и настроить интеграцию на него :twisted:

а так второй вариант выглядит разумнее. для его реализации можете воспользоваться скриптом http://www.community.terrasoft.ru/blogs/9611#comment-40936 (надо будет откорректировать немного для одной таблицы и определенных записей)

Можно права на создание дать, но при попытке создать отказывать программно.

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

Думаю, Александр прав. Лучшим решением будет просто программно скрыть кнопку "Добавить" для пользователей, не подходящих по каки-либо условиям.

Андрей, ох не советую вам просто скрывать кнопку "Добавить". Как я уже писал, пользователи шустрые. Я это сначала сделал, так они стали добавлять продукты через счета (хотя раньше, когда еще ни права не разграничивали, ни кнопки скрывали, им постоянно говорили, продукты заводятся только в 1С, посылайте запрос бухам, они создатут, а у вас есть кнопочка "Загрузить номенклатуру", ну ни как до них не доходило это). На детали продукты в счетах добавляем продукт, а там, опа, кнопки в зависимости от прав. В результате через пару недель, когда это обнаружилось, было очень много счетов с пустыми продуктами (они экспортировались в 1С, в 1С эти продукты не находились, поэтому ставились пустые, а когда летели назад, то в счет ставились пустые, так как в 1С пусто). И хорошо, что пользователи обычно все свои счета в pdf хранили на рабочих столах, как-то смог восстановить, а если бы не было ...
Так что лучше работать с правами.

Здравствуйте, Александр.

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

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

"Репко Артём" написал:Так или иначе, дыра в безопасности Вам обеспечена какой бы вариант Вы не выбрали.

мб все-таки создать view?

Александр, с View идея хорошая.

"Андросов Дмитрий" написал:мб все-таки создать view?

Не вижу смысла. Право читать данные, насколько я понимаю, у пользователей и так есть.
Вставлять данные, используя Dataset и метод Append? Сомнительное преимущество.

Минусы:
1. Дополнительная дыра в безопасности (на этот раз уже в чтении данных счетов);
2. Опять же меньший контроль для операции вставки, чем через хранимую процедуру (например, можно организовать логирование- просто вставку в другую таблицу - операции импорта с указанием пользователя, который вызвал процедуру). Конечно этого же можно достичь, создав Instead Of триггер, но зачем тогда городить огород с представлением.

Напишите преимущества. Возможно, чего-то не учел.

"Репко Артём" написал:Напишите преимущества. Возможно, чего-то не учел.

Пользователи работают с представлениями
Ограничения для пользователей по правам доступа реализуются в представлении:

CREATE VIEW [dbo].[vw_Account]
AS 
  SELECT [P].* 
  FROM [dbo].[tbl_Account] AS [P] with(nolock)
  WHERE EXISTS (
    SELECT * FROM [dbo].[tbl_AccountRight] AS [R] with(nolock)
    WHERE (([R].[RecordID] = [P].[ID]) 
    AND EXISTS(
      SELECT * FROM [dbo].[tbl_UserAdminUnit] AS [U] with(nolock)
      WHERE ([R].[AdminUnitID] = [U].[AdminUnitID]) 
      AND ([U].[UserName] = SYSTEM_USER))))

Если создать представление vw_Account1C без запроса на права и сделать в террасофте фиктивный сервис таблицы tbl_Account1C - для пользователя получится вторая таблица (но уже без учета прав в принципе).
Для этой таблицы настроить интеграцию (т.к. это просто представление - все данные пойдут все равно в tbl_Account).

Преимущества: пользователи могут работать с таблицей без учета прав, но только в рамках интеграции (на изменение которой права распространяются), ни в каких других местах они данные из таблицы получить не смогут, и уж тем более вставить. Вернее это можно администрировать.
Недостаток только один: под админом все это работать не будет )).

Права для вставляемых через интеграцию записей можно настроить в триггерах представления.

И да, я такое делать не пробовал :wink:

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

Вот тут не понял. Что помешает любому пользователю подключиться к БД и сделать INSERT/UPDATE/DELETE в vw_Account1C? Как Вы его ограничите использование только интеграцией с 1С?

"Андросов Дмитрий" написал:Если создать представление vw_Account1C без запроса на права и сделать в террасофте фиктивный сервис таблицы tbl_Account1C - для пользователя получится вторая таблица (но уже без учета прав в принципе).

Тут все понятно. Как создавать представления на уровне сервисов Terrasoft 3.X - это элементарно. Мой вопрос остается - зачем? В чем выигрыш по сравнению с использованием хранимки? Только то, что будем использовать Dataset.Append?

"Репко Артём" написал:Что помешает любому пользователю подключиться к БД

Например, файрвол. Конечно, и он лишь "помешает", но это речь уже о среде приложения, а не о нем самом.

"Репко Артём" написал:В чем выигрыш по сравнению с использованием хранимки?

сохранение абстракции уровней приложения.

Показать все комментарии