Дескриптор безопасности

Материал из GedeminWiki
(Различия между версиями)
Перейти к: навигация, поиск
(Очистка заданного бита в дескрипторах безопасности)
Строка 53: Строка 53:
 
   achag=bin_and(achag, bin_not(bin_shl(1, :n-1))),
 
   achag=bin_and(achag, bin_not(bin_shl(1, :n-1))),
 
   afull=bin_and(afull, bin_not(bin_shl(1, :n-1)))
 
   afull=bin_and(afull, bin_not(bin_shl(1, :n-1)))
 +
WHERE
 +
  parent IS NULL
 +
</syntaxhighlight>
 +
 +
== Установка заданного бита в дескрипторах безопасности ==
 +
 +
Приведенный ниже запрос устанавливает бит для групп с илентификатором, заданным параметром N, для всех шапок документов:
 +
 +
<syntaxhighlight lang="SQL">
 +
UPDATE gd_document SET aview=bin_or(aview, bin_shl(1, :n-1)),
 +
  achag=bin_or(achag, bin_shl(1, :n-1)),
 +
  afull=bin_or(afull, bin_shl(1, :n-1))
 
WHERE
 
WHERE
 
   parent IS NULL
 
   parent IS NULL

Версия 10:26, 20 июня 2012

Дескриптор безопасности — это 32-х битовое целое число содержащее битовую маску групп пользователей обладающих определенным правом доступа. Если n-ый бит в дескрипторе установлен, следовательно группа пользователей с id=n обладает указанным правом.

Содержание

Разграничение доступа на уровне записи

Основное применение дескриптора безопасности — это разграничение доступа к записям в таблице. Для этого в таблицу добавляются от одного до трех полей имеющих предопределенные названия: AVIEW, ACHAG, AFULL. Тип полей задается доменом dsecurity.

Поле AVIEW определяет какие группы имеют право на просмотр записи, ACHAG определяет множество групп имеющие право на изменение записи и, наконец, AFULL &mdash дескриптор безопасности полного доступа к записи (просмотр, изменение, удаление, печать, изменение прав доступа).

Набор групп текущего пользователя

Множество групп, в которые входит текущий пользователь, задается битовой маской, хранящейся в свойстве InGroup глобального объекта IBLogin.

Ниде приводится пример кода, который позволяет получить строку с наименованиями всех групп, в которые входит текущий пользователь системы:

  ...
  dim Creator, UG, InGroups
  set Creator = new TCreator
  set UG = Creator.GetObject(Application, "TgdcUserGroup", "")
  InGroups = "" 
  UG.Open
  do while not UG.EOF
    if ((2 ^ (UG.id - 1)) and IBLogin.InGroup) <> 0 then
      if InGroups > "" then
        InGroups = InGroups & ", "
      end if
      InGroups = InGroups & UG.FieldByName("name").AsString
    end if
    UG.Next
  loop
  ...

Аналогичного результата можно добиться с помощью SQL запроса. Запрос ниже выводит список пользователей и групп для каждого пользователя:

SELECT
  u.name,
  LIST(g.name, ', ')
FROM
  gd_user u JOIN gd_usergroup g
    ON BIN_AND(u.ingroup, BIN_SHL(1, g.id - 1)) <> 0
GROUP BY
  u.name

Очистка заданного бита в дескрипторах безопасности

При создании новой группы соответствующий бит в дескрипторах безопасности существующих записей уже может быть установлен. Соответственно, группа получит доступ к таким записям. Приведенный ниже запрос снимает бит для групп с илентификатором, заданным параметром N, для всех шапок документов:

UPDATE gd_document SET aview=bin_and(aview, bin_not(bin_shl(1, :n-1))),
  achag=bin_and(achag, bin_not(bin_shl(1, :n-1))),
  afull=bin_and(afull, bin_not(bin_shl(1, :n-1)))
WHERE
  parent IS NULL

Установка заданного бита в дескрипторах безопасности

Приведенный ниже запрос устанавливает бит для групп с илентификатором, заданным параметром N, для всех шапок документов:

UPDATE gd_document SET aview=bin_or(aview, bin_shl(1, :n-1)),
  achag=bin_or(achag, bin_shl(1, :n-1)),
  afull=bin_or(afull, bin_shl(1, :n-1))
WHERE
  parent IS NULL
Персональные инструменты
Пространства имён

Варианты
Действия
Навигация
Инструменты