Нужно разрешить редактировать только отдельные поля

IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.

Модератор: kdv

Tokolist

Сообщение Tokolist » 27 окт 2006, 23:36

Karp писал(а):а что, у вас юзера сами запросы пишут?
slv2 писал(а):слава богу, таких продвинутых пользователей у меня нет.
Karp писал(а):у нас он не сможет этого сделать, т.к. не знает имени сервера и пути к базе
Так кому будет очень нужно - тот узнает.
Даже с помощью такого простенького приложения как ResHacker можно это сделать (все свойства компонентов хранятся в ресурсах).
А у меня вообще все просто, ведь у меня эту информацию можно узнать из окна настроек или ini-файла.
Надеюсь до софтайса обсуждение не дойдет, а то оффтоп получится :D .

Karp писал(а):Хотя я считаю права на поля избыточностью
Может и так, но у меня есть такая необходимость, по этому и ломаю себе голову.

stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

Сообщение stix-s » 30 окт 2006, 12:00

slv2 писал(а):
Karp писал(а):Хотя я считаю права на поля избыточностью
Может и так, но у меня есть такая необходимость, по этому и ломаю себе голову.
Если будешь использовать DB aware компоненты, может все-таки подумать о FIB+?
а если нет, то поскольку ты будешь собирать строку в IBQuery
по нажатию кнопушки, то как тебе там впишут лишнее ubdate set.... и тд пользователи?

Tokolist

Сообщение Tokolist » 31 окт 2006, 22:39

stix-s писал(а):Если будешь использовать DB aware компоненты, может все-таки подумать о FIB+?
Да FIB+ это конечно бог среди компонентов доступа к IB и подобных :) . Но давайте рассмотрим (да простит меня великий и могучий копирайт :) ) маленький кусочек кода из вышеупомянутого:

Код: Выделить всё

if FAutoUpdateOptions.UpdateOnlyModifiedFields then
begin
    case SK of
      skModify:
        begin
          if not Fields[i].IsBlob then
          begin
            case Fields[i].DataType of
             ftLargeint:
              if TLargeintField(Fields[i]).Value = TFIBLargeintField(Fields[i]).OldValue then
               Continue;
             ftBCD     :
              if not  TFIBBCDField(Fields[i]).FieldModified  then
               Continue;
             ftBytes   :;
            else
             if Fields[i].OldValue = Fields[i].Value then
              Continue
            end
          end
          else
          if not BlobModified(Fields[i]) then
            Continue;
        end;
      FIBDataSet.skInsert: if Fields[i].IsNull then
          Continue;
    end;
end;
В принципе ничего лучшего он не делает. Так зачем мне использовать FIBPlus если меня вполне устраивает IBX, за исключением проблемы, с которой я уже в принципе справился (может еще чуточку доработаю).

И еще. Даже, если б я использовал не DB Aware компоненты, все равно пришлось бы генерировать запрос с не модифицированными полями!!!
stix-s писал(а):а если нет, то поскольку ты будешь собирать строку в IBQuery
по нажатию кнопушки, то как тебе там впишут лишнее ubdate set.... и тд пользователи?
Дело не в том кто, что и куда впишет, а в том, зачем заведомо разрабатывать дырявую базу?

stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

Сообщение stix-s » 01 ноя 2006, 11:28

slv2 писал(а): Да FIB+ это конечно бог среди компонентов доступа к IB и подобных :) .
ну, может и не бог, но я к ним привык :) хотя, конечно иногда Merlin прав и обилие "фич" утомляет.
Но, все равно я их не брошу, патамушта он хороший :)
slv2 писал(а): В принципе ничего лучшего он не делает.
Если тебя волнуют именно модифицированные блобы, то да, ежели в общем плане, то при раздаче прав на конкретные поля работать легче
slv2 писал(а): И еще. Даже, если б я использовал не DB Aware компоненты, все равно пришлось бы генерировать запрос с не модифицированными полями!!!
не асилил :( если проверяешь поля на модифицированность самостоятельно, кто мешает построить запрос только с модифицированными полями?
slv2 писал(а): Дело не в том кто, что и куда впишет, а в том, зачем заведомо разрабатывать дырявую базу?
опять не асилил, каким образом повышает "дырявость" базы то, что ты "вручную" собираешь запрос?

Tokolist

Сообщение Tokolist » 01 ноя 2006, 23:09

stix-s писал(а):Если тебя волнуют именно модифицированные блобы
Блобы он тоже проверяет на модифицированность

Код: Выделить всё

if not BlobModified(Fields[i]) then 
Continue;
Я к тому что он тоже просто проверяет каждое поле изменялось ли оно и формирует запрос только с теми полями, которые были изменены. Что делаю и я (то есть никаких преимуществ лично мне он не даст).
stix-s писал(а):
slv2 писал(а):И еще. Даже, если б я использовал не DB Aware компоненты, все равно пришлось бы генерировать запрос с не модифицированными полями!!!
не асилил :) если проверяешь поля на модифицированность самостоятельно, кто мешает построить запрос только с модифицированными полями?
Да я так и делаю.
Это я написал к тому, что не имеет значения DB Aware компоненты или нет. Ведь проблема не в компонентах, а в том что если выполнить запрос:

Код: Выделить всё

update "table" set "field1" = :"field1", "field2" = :"field2"
для таблицы в которой текущему пользователю нельзя модифицировать поле field2, а только поле field1

Код: Выделить всё

grant update ("field1") on "table" to user
, то Firebird будет ругатся.
stix-s писал(а):
slv2 писал(а):Дело не в том кто, что и куда впишет, а в том, зачем заведомо разрабатывать дырявую базу?
опять не асилил, каким образом повышает "дырявость" базы то, что ты "вручную" собираешь запрос?
Или это я что-то не правильно понял... или тут поступило предложение создавать табличку с битовими полями и потом выставлять, пользуясь этой табличкой, CanModify (гранты при этом на поля не раздавать). Ну простому пользователю конечно с такой сложной задачей как ввести данные в недоступной контрол справится конечно не получится :D . Но какой-нибудь "кул хацкер" используя какой-нибудь инструмент (коих в сети, извините, дофига) типа IBExpert введет себе спокойненько строчки типа

Код: Выделить всё

update "table" set "field1" = :"field1", "field2" = :"field2"
и изменит поле которое ему нельзя изменять.
Но я не к тому, что у меня такие "крутые" пользователи, а к тому, что не правильно это с точки зрения безопасности.

stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

Сообщение stix-s » 02 ноя 2006, 08:55

slv2 писал(а): Или это я что-то не правильно понял... или тут поступило предложение создавать табличку с битовими полями и потом выставлять, пользуясь этой табличкой, CanModify (гранты при этом на поля не раздавать). Ну простому пользователю конечно с такой сложной задачей как ввести данные в недоступной контрол справится конечно не получится :D .
неееее, я этого не предлагаю :)
я могу только предложить выполнить в IBExpert запрос вида:

Код: Выделить всё

  SELECT UP.RDB$PRIVILEGE
   FROM RDB$USER_PRIVILEGES UP
  where
   UP.RDB$RELATION_NAME=upper(':tablename') and
   UPPER(UP.RDB$USER)=UPPER(':username')
-- UPPER(UP.RDB$USER)=UPPER(current_role)
-- UPPER(UP.RDB$USER)=UPPER(current_user)
после раздачи прав на поля по ролям(пользователям)
slv2 писал(а): Но какой-нибудь "кул хацкер" используя какой-нибудь инструмент (коих в сети, извините, дофига) типа IBExpert введет себе спокойненько строчки типа
чтобы это проделать этот гипотетический кулхацкер должен иметь доступ к серверу с БД (по TCP/IP), знать имя базы, путь к ней, имя пользователя, пароль, структуру базы
Не похоже, что это сотрудник вашего предприятия? :)
смотрим логи, ловим, отрываем рученки
Большинство "взломов" - это свои, так сказать внутренние.

А по поводу FIB+ так например вчера поставил в базе триггер на update и с час не мог понять, почему при update таблицы он в приложении у меня отрабатывает 2 раза, а в IBExpert, как и положено один раз :)
потом вспомнил про опцию poProtectedEdit и "холостой" update :)
но на IBX не вернусь :)

Tokolist

Сообщение Tokolist » 22 ноя 2006, 21:48

Немного свободного времени и желания... и вот что у меня получилось (ссылка та же):
http://pelesh.pochta.ru/pibqueryex.zip (15 КБ)
Теперь компонент может выставлять автоматически свойства ReadOnly полей на которые нет права на модифицирование (насколько я знаю такой фичи нет даже в FIBPlus :) ).
Это справляет гораздо больший психологический эффект на пользователей :) чем ошибка и потом не надо объяснять почему она появляется.
Короче, компонент меня теперь полностью устраивает.
Возможно он будет полезен тем, кто столкнулся с такой же проблемой, и кто все еще пользуется IBX.
ОГРОМНОЕ спасибо всем кто принял участие в обсуждении!

Ответить