Работа с правами доступа
Система позволяет назначать права на отдельные объекты, для чего используется система безопасности Windows, основанная на пользователях и группах (доменных или локальных) и описателях прав (дескрипторах).
Право дается или запрещается пользователю при помощи объекта ACE (access control entry
), который задаёт маску прав. Права могут быть даны (allowed
) или запрещены (denied
) конкретному пользователю или группе (security principal
).
ACE объединяются в список ACL (access control list
). DACL (discretionary access control list
) хранится в описателе прав (security descriptor
), в котором, кроме списка DACL, есть ещё информация о владельце объекта (owner
), а также настройки аудита в виде списка SACL (system access control list
). Кроме того, начиная с версии 4.3, поддерживается использование в дескрипторе метки уровня доступа (mandatory access control, MAC
).
В текущей версии платформы аудит не поддерживается. |
Права, которые можно настраивать на объектах, делятся на общие (general
) и специфические (specific
). Общие отображаются в главном диалоге настройки безопасности. Специфические появляются в списке в окне Advanced. Общие права используются для упрощения администрирования. Специфические права дают администратору возможность управлять поведением объектов на более тонком уровне.
AccessGeneral
) состоят из набора частных прав:-
Чтение (
R
,RP
). -
Изменение (
W
,CC
,DC
). -
Удаление (
D
). -
Полный доступ (все права).
AccessSpecific
):-
Чтение данных объекта (
R
). -
Изменение данных объекта (
W
). -
Создание дочерних объектов (
CC
). -
Удаление дочерних объектов (
DC
). -
Удаление объекта (
D
). -
Чтение разрешений (
RP
). -
Изменение разрешений (
SP
). -
Смена владельца (
TO
).
Для этого в каждом из этих объектов предусмотрено два специальных метода: GetAccessControl
— возвращающий описатель прав и SetAccessControl
, устанавливающий описатель прав.
Наследование прав
В системе реализовано наследование прав от родительских к дочерним объектам следующим образом:
-
Карточка наследует права от других карточек, которые держат на данную карточку сильные ссылки (а физически от строки, в которой содержится ссылка). При установке первой сильной ссылки на карточку её права меняются, чтобы отразить включившееся наследование. При изменении прав на родительскую карточку права на подчинённую карточку меняются соответственно.
-
Секция карточки наследует от экземпляра карточки, которому он принадлежит, или от родительской строки если это подчинённая секция.
-
Строка наследует права от своей секции.
-
Файл наследует от карточки владельца, если она задана.
Частным, но важным случаем является наследование прав от папки на карточку. Папка — это строка в карточке папок — от неё права наследуют все ярлыки в папке. По сильным ярлыкам права переходят на карточки. Таким образом, права на карточки, на которые существуют сильные ярлыки, наследуются от карточки папок.
В Windows-клиенте права на карточку папок могут быть отредактированы на узле Папки. Данный частный случай относится только к Docsvision 4.5. В более поздних версиях Docsvision ярлык является слабой ссылкой — дискреционные права, установленные для папки, не будут унаследованы карточками, ярлыки на которые размещены в папке.
-
ContainerInheritAce
— права распространяются на дочерние контейнеры; -
ObjectInheritAce
— права распространяются на дочерние объекты; -
InheritOnlyAce
— права распространяются только на потомков, но не на сам объект.
Таким образом, возможные сочетания этих флагов определяют многообразие типов наследования прав:
Кто наследует | Сочетание флагов |
---|---|
Этот объект, дочерние контейнеры и объекты |
|
Этот объект и дочерние контейнеры |
|
Этот объект и дочерние объекты (не контейнеры) |
|
Только дочерние контейнеры и объекты |
|
Только дочерние контейнеры |
|
Только дочерние объекты (не контейнеры) |
|
Только этот объект |
Все стандартные объекты системы (карточки, секции, строки) являются контейнерами и именно в таком качестве рассматриваются при наследовании прав. |
Программное назначение прав
Объекты связанные с реализацией модели безопасности расположены в специальном пространстве имён — DocsVision.Platform.Security.AccessControl
, которое реализовано в отдельной сборке — DocsVision.Platform.dll
. Поэтому для работы с безопасностью, эту сборку следует предварительно подключить к своему проекту, а также определить используемое пространство имён:
using DocsVision.Platform.Security.AccessControl;
Классы для работы с правами карточек, файлов, и хранимых процедур унаследованы от базового класса DVObjectSecurity
, который содержит основные механизмы для работы с правами. Кроме этого, каждый из них содержит ряд специфических свойств, характерных именно для данного объекта (схемы прав). Этот класс по сути дела описывает дескриптор (SD
), и включает в себя методы для работы с разрешениями (ACE
), аудитами, и другими свойствами дескриптора.
Обращаем внимание, что численные значения некоторых элементов перечислений, описывающих права доступа были изменены относительно Docsvision 4.х. И в случае, если в системе имеется унаследованное от Docsvision 4.x решение, в котором работа с флагами прав доступа осуществлялась через использование целочисленных констант, а не через использование вышеописанных перечислений, то рекомендуется проверить соответствие использованных целочисленных констант актуальным значениям перечислений. |
Общий алгоритм работы с правами в рамках данной модели можно сформулировать следующим образом:
-
Получить объект для работы с разрешениями
CardData.GetAccessControl
-
Создать новое разрешение
CardDataAccessRule
с необходимыми атрибутами. -
Добавить разрешение к описателю прав
AddAccessRule
илиSetAccessRule
. -
Сохранить изменённый описатель прав
SetAccessControl
.В примере, для существующей карточки с идентификатором
00000000-0000-0000-0000-000000000000
добавляются права на чтение для пользователяIvanovII
.CardData card = userSession.CardManager.GetCardData(new System.Guid("00000000-0000-0000-0000-000000000000")); (1) CardDataSecurity cardDataSecurity = card.GetAccessControl(); (2) CardDataAccessRule cardDataAccessRule = new CardDataAccessRule("DOMAIN\\IvanovII", CardDataRights.Read, AccessControlType.Allow); (3) cardDataSecurity.SetAccessRule(cardDataAccessRule); (4) card.SetAccessControl(cardDataSecurity); (5)
1 Получение с сервера данных карточки с известным идентификатором. 2 Получение описателя прав карточки. 3 Создание нового разрешения — совокупного права чтения. 4 Добавление нового разрешения к описателю прав. 5 Сохранение изменённого описателя прав.
-
Получить объект для работы с разрешениями
CardData.GetAccessControl
. -
Удалить разрешения для субъекта:
-
Методом
PurgeAccessRules
, чтобы удалить все разрешения для субъекта -
Методом
RemoveAccessRuleSpecific
, чтобы удалить конкретное разрешение для субъекта. -
Методом
SetAccessRule
, чтобы удалить все разрешения для субъекта и добавить вместо них новое.
-
-
Сохранить изменённый описатель прав
SetAccessControl
.Ниже приведён пример, в котором у пользователя
IvanovII
отбираются права на карточку с идентификатором00000000-0000-0000-0000-000000000000
.CardData card = userSession.CardManager.GetCardData(new System.Guid("00000000-0000-0000-0000-000000000000")); CardDataSecurity cardDataSecurity = card.GetAccessControl(); cardDataSecurity.PurgeAccessRules(new NTAccount("DOMAIN\\IvanovII")); (1) card.SetAccessControl(cardDataSecurity); (2)
1 Удаление всех прав пользователя. 2 Сохранение изменённого описателя прав.
Значения битовых флагов стандартных прав приведены в таблице: "Битовые флаги стандартных прав доступа" |