Перечень статей   Терминология   Choose language


Права доступа для каждой записи, невидимость записей


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

create table anytable (
  a1         int,
  a2         num legal
)

Любому пользователю, вносящему данные, нужно право на обновление, т.к. он может ошибиться в вносимых значениях. Любой изменяющий поля может записать в них бессмысленные значения или присвоить полям "null" - и то, и другое равносильно удалению записи. Очень странно выглядело бы право на обновление без права на чтение. Отсюда следует, что право на обновление бессмысленно без прав на удаление и чтение и должно быть дополнено ими - такое целостное право назовем правом оперировать (operate = update + delete + read). Таким образом доступ к отраслям принимает только три значения: чтение, оперирование, отсутствие доступа.

Внутри СУБД права одного пользователя резонно объединить в массив, и предоставить доступ к таким массивам через системную таблицу "right2department".

create table right2department (
  user       num,
  department num,
  right[]    bit2              -- 10=read, 01=operate, 00=no rights
)

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

create table sys4user (
  id         num,
  username   string,
  password   string,
  trace      num
)

Записи, полученные графическим интерфейсом, должны иметь пометку о том, может пользователь поля только читать или еще и изменять. Такая однобитная пометка вычисляется на основе значения правового поля и элемента массива 'right' таблицы 'right2department'. Вычисленное значение удобно высылать в самой записи в дополнительном поле типа 'bit1' (0=read only, 1=operate). Такие "вычисленные" поля реально не существуют (и естественно недоступны для записи), и мы будем помечать их как "secondary".

create table anytable (
  a1         int,
  a2         num legal,
  a3         bit1 secondary
)

Тюрин Дмитрий



Перечень статей   Терминология   Choose language