Дескриптор безопасности
SYSDBA (обсуждение | вклад) (→Набор групп текущего пользователя) |
SYSDBA (обсуждение | вклад) |
||
| Строка 1: | Строка 1: | ||
| − | Дескриптор безопасности | + | Дескриптор безопасности — это 32-х битовое целое число содержащее битовую маску групп пользователей обладающих определенным правом доступа. Если n-ый бит в дескрипторе установлен, следовательно группа пользователей с id=n обладает указанным правом. |
== Разграничение доступа на уровне записи == | == Разграничение доступа на уровне записи == | ||
| − | + | Основное применение дескриптора безопасности — это разграничение доступа к записям в таблице. Для этого в таблицу добавляются от одного до трех полей имеющих предопределенные названия: '''AVIEW''', '''ACHAG''', '''AFULL'''. Тип полей задается доменом [[dsecurity]]. | |
| − | + | ||
| − | + | ||
| + | Поле '''AVIEW''' определяет какие группы имеют право на просмотр записи, '''ACHAG''' определяет множество групп имеющие право на изменение записи и, наконец, '''AFULL''' &mdash дескриптор безопасности полного доступа к записи (просмотр, изменение, удаление, печать, изменение прав доступа). | ||
== Набор групп текущего пользователя == | == Набор групп текущего пользователя == | ||
| − | Множество групп, в которые входит текущий пользователь, задается битовой маской, хранящейся в свойстве | + | Множество групп, в которые входит текущий пользователь, задается битовой маской, хранящейся в свойстве '''InGroup''' глобального объекта '''IBLogin'''. |
| − | InGroup глобального объекта IBLogin. | + | |
Ниде приводится пример кода, который позволяет получить строку с наименованиями всех групп, в которые входит текущий пользователь системы: | Ниде приводится пример кода, который позволяет получить строку с наименованиями всех групп, в которые входит текущий пользователь системы: | ||
| + | <syntaxhighlight lang="vbnet"> | ||
... | ... | ||
dim Creator, UG, InGroups | dim Creator, UG, InGroups | ||
| Строка 31: | Строка 30: | ||
loop | loop | ||
... | ... | ||
| + | </syntaxhighlight> | ||
| + | |||
| + | Аналогичного результата можно добиться с помощью SQL запроса. Запрос ниже выводит список пользователей и групп для каждого пользователя: | ||
| + | |||
| + | <syntaxhighlight lang="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 | ||
| + | </syntaxhighlight> | ||
| + | |||
| + | == Очистка заданного бита в дескрипторах безопасности == | ||
| + | |||
| + | При создании новой группы соответствующий бит в дескрипторах безопасности существующих записей уже может быть установлен. Соответственно, группа получит доступ к таким записям. Приведенный ниже запрос снимает бит для групп с илентификатором, заданным параметром N, для всех шапок документов: | ||
| + | |||
| + | <syntaxhighlight lang="SQL"> | ||
| + | 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 | ||
| + | </syntaxhighlight> | ||
[[Category:База данных]] | [[Category:База данных]] | ||
Версия 08:03, 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