Опубликован: 07.05.2010 | Уровень: специалист | Доступ: платный
Лекция 25:

Администрирование InterBase: безопасность БД

< Лекция 24 || Лекция 25: 12 || Лекция 26 >

Права

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

  • Для таблиц и их полей команды SELECT, INSERT, UPDATE, DELETE и REFERENCES (право на создание ограничений внешнего ключа FOREIGN KEY для данной таблицы. Если таблица содержит внешний ключ, а пользователь должен иметь право на изменение таблицы, то это право ему необходимо также предоставить).
  • Для просмотров VIEW команды SELECT, INSERT, UPDATE и DELETE.
  • Для хранимых процедур команда EXECUTE.

Таким образом, пользователю можно предоставить, например, права на изменение каких то отдельных столбцов; на другие столбцы только просмотр; возможность добавлять новую запись, но без возможности ее удалить. Могут быть пользователи с правами только на просмотр определенных таблиц или, наоборот, с полными правами на все объекты БД. Раздаются права командой GRANT.

Предоставлять пользователям права удобней утилитой IBConsole. Загрузите IBConsole, войдите в локальный сервер и базу данных First. Дадим пользователю PUPKIN (которого мы создали в "Введение в клиент-серверные БД. InterBase" ) права на просмотр таблицы Tovar. Откройте окно Interactive SQL и введите следующую команду:

GRANT SELECT ON TOVAR TO PUPKIN;

После нажатия кнопки Execute Query, пользователь PUPKIN получит права на просмотр этой таблицы. Убедиться в этом можно, выделив в IBConsole таблицу Tovar, щелкнув по ней правой кнопкой и выбрав команду Properties. Перейдем на вкладку Permission:

Права на таблицу Tovar

Рис. 25.2 . Права на таблицу Tovar

Как видим, пользователь SYSDBA имеет на таблицу все права, тогда как пользователь PUPKIN - только на чтение. И еще мы можем сделать вывод, что если пользователи и их пароли хранятся в системной БД InterBase, то их права на объекты рабочей БД хранятся в этой самой БД.

Значок открытой руки в правах пользователя SYSDBA означает, что эти права могут передаваться другим пользователям. Дадим пользователю PUPKIN права на модификацию записей, с возможностью передачи этого права другим пользователям. Для этого существует дополнительный оператор WITH GRANT OPTION. Снова откроем Interactive SQL и введем следующую команду:

GRANT UPDATE ON TOVAR TO PUPKIN WITH GRANT OPTION;

Если мы снова откроем вкладку Permission таблицы Tovar, то убедимся, что PUPKIN теперь имеет право не только изменять записи таблицы, но и передавать это право другим пользователям. Причем каждый пользователь может передавать лишь те права или их часть, которые есть у него самого.

Чтобы предоставить пользователю права на отдельные столбцы в таблице, их нужно перечислить в скобках:

GRANT UPDATE (FNAME, FTYPE, FCENA) ON FOOD TO PUPKIN;

Предоставление прав для списка столбцов может быть только на команды UPDATE и PREFERENCES, для других команд необходимо указывать всю таблицу. Если пользователю требуется предоставить сразу несколько различных прав на таблицу, эти права можно указать через запятую:

GRANT SELECT, INSERT, UPDATE  ON  PRIM_1 TO PUPKIN;

Через запятую можно указать и список пользователей:

GRANT SELECT, INSERT ON DAYS TO PUPKIN, MISHA;

Чтобы предоставить пользователю ВСЕ права на объект, можно использовать оператор ALL:

GRANT ALL ON SKLAD TO PUPKIN;

А чтобы предоставить какое то право ВСЕМ зарегистрированным пользователям, можно воспользоваться "виртуальным" пользователем PUBLIC:

GRANT ALL ON SDELKI TO PUBLIC;

Права можно не только дать, но и отнять. Делается это командой REVOKE, которая является копией GRANT, только с обратным действием (вместо TO <пользователь> синтаксис использует FROM <пользователь>). Например, снять все права у всех пользователей на таблицу Sdelki можно командой:

REVOKE ALL ON SDELKI FROM PUBLIC;

Пользователь SYSDBA при этом прав на таблицу не потеряет.

Роли

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

  1. Создать роль.
  2. Присвоить этой роли необходимые права.
  3. Назначить нужным пользователям эту роль.
  4. При соединении с БД указать не только имя пользователя и пароль, но и его роль.

Выполним эту последовательность в окне Interactive SQL:

CREATE ROLE BUH; /*Создаем роль*/
GRANT ALL ON SDELKI TO BUH; /*присваиваем ей права*/
GRANT BUH TO PUPKIN; /*Предоставляем роль пользователю*/

Теперь, если мы выделим в дереве серверов в нашей БД раздел Roles, то увидим новую роль BUH:

Создание роли

Рис. 25.3 . Создание роли

А если щелкнуть по BUH в правой части окна правой копкой и выбрать команду Properties, мы увидим, что на эту роль имеет право пользователь PUPKIN. Чтобы подключить пользователя PUPKIN к БД в контексте роли, а не как просто пользователя, в параметрах компонента IBDatabase нужно будет указать следующие параметры:

user_name=pupkin
password=qwerty
sql_role_name=buh
lc_ctype=WIN1251

Это сработает только в том случае, если данному пользователю действительно присвоена эта роль. Таким образом, в клиентском приложении можно сделать гибкую систему подключений пользователя: как простого пользователя с одними правами, и как пользователя в контексте роли с другими правами.

Если же мы подключаемся к БД другим образом, например, через SQL -скрипт, то параметры подключения могут выглядеть иначе:

CONNECT C:\DATABASES\FIRST.GDB 
USER PUPKIN
ROLE BUH
PASSWORD qwerty;

Удаляется роль командой DROP, при этом все права роли на объекты утрачиваются:

DROP ROLE BUH;
< Лекция 24 || Лекция 25: 12 || Лекция 26 >
Евгений Медведев
Евгений Медведев

В лекции №2 вставляю модуль данных. При попытке заменить name на  fDM выдает ошибку: "The project already contains a form or module named fDM!". Что делать? 

Анна Зеленина
Анна Зеленина

При вводе типов успешно сохраняется только 1я строчка. При попытке ввести второй тип вылезает сообщение об ошибке "project mymenu.exe raised exception class EOleException with message 'Microsoft Драйвер ODBC Paradox В операции должен использоваться обновляемый запрос'. 

Денис Попов
Денис Попов
Россия, Оренбург, Оренбургский государственный университет, 2015
Рустам Кадыров
Рустам Кадыров
Россия, Тирлян, Тирлянская школа №5, 2003