Для выполнения примера предполагается наличие репозитория НСИ - "NSI_1", содержащего справочник НСИ с идентификатором "Dict_1". Для справочника включена опция наличия прав доступа у элементов. В список субъектов доступа, кроме базового пользователя Admin и группы Администраторы, также включены еще два пользователя. Им сопоставлены метки безопасности 2 и 3. Данные пользователи не входят в группу администраторов.
Sub UserProc;
Var
MB: IMetabase;
MObj: IMetabaseObject;
Dict: IRdsDictionary;
Attrs: IRdsAttributes;
DictInst: IRdsDictionaryInstance;
Elements: IRdsDictionaryElements;
Element: IRdsDictionaryElement;
Data: IRdsDictionaryElementData;
SecLab: ISecurityLabels;
User, User1, User2: ISecuritySubject;
Begin
MB := MetabaseClass.Active;
//Получаем справочник НСИ
MObj := MB.ItemByIdNamespace("Dict_1", MB.GetObjectKeyById("NSI_1")).Bind;
Dict := MObj As IRdsDictionary;
//Получаем список атрибутов
Attrs := Dict.Attributes;
//Открываем справочник
DictInst := Dict.Open(Null);
Elements := DictInst.Elements;
//Получаем первый элемент, для которого
будут розданы права
Element := Elements.Item(1);
Data := Element.Data;
SecLab := MObj.SecurityDescriptor.LabelSecurity;
User := SecLab.Mapping(0); //Admin
User1 := SecLab.Mapping(2); //Первый дополнительный пользователь
User2 := SecLab.Mapping(3); //Второй дополнительный пользователь
//Раздаем права
Data.AccessAttribute(Attrs.AccessAccess.Key) := SecLab.ValueStr(User);
Data.AccessAttribute(Attrs.DeleteAccess.Key) := SecLab.ValueStr(User1);
Data.AccessAttribute(Attrs.ReadAccess.Key) := (SecLab.Value(User) + SecLab.Value(User1) + SecLab.Value(User2)).ToString;
Data.AccessAttribute(Attrs.WriteAccess.Key) := (SecLab.Value(User1) + SecLab.Value(User2)).ToString;
//Обновляем информацию об элементе
Element.Update(Data);
End Sub UserProc;
После выполнения примера будут изменены права доступа для первого элемента справочника НСИ. Право на просмотр элемента будет у всех пользователей. Право на удаление будет у первого дополнительного пользователя. Право на редактирование будет у двух дополнительных пользователей. Право на изменение прав будет только у пользователя Admin.
Для проверки имеющихся прав доступа необходимо привести маску к двоичному виду и проверить кому сопоставлены биты, имеющие значение «1». Биты, имеющие значение «0», соответствуют субъектам безопасности, для которых установлен запрет действия, либо биты не сопоставлены с какими-либо субъектами безопасности. Для преобразования маски к двоичному виду воспользуемся процедурой DecToBin, код которой представлен в примере «Работа с маской доступа».
Sub CheckMask;
Var
MB: IMetabase;
MObj: IMetabaseObject;
DictInst: IRdsDictionaryInstance;
Elements: IRdsDictionaryElements;
Element: IRdsDictionaryElement;
SecLab: ISecurityLabels;
AccessMask: Integer;
BinMask: String;
c: Char;
i: Integer;
Begin
MB := MetabaseClass.Active;
//Получаем справочник НСИ
MObj := MB.ItemByIdNamespace("Dict_1", MB.GetObjectKeyById("NSI_1")).Bind;
//Открываем справочник
DictInst := MObj.Open(Null) As IRdsDictionaryInstance;
Elements := DictInst.Elements;
//Получаем первый элемент, для которого определены права доступа
Element := Elements.Item(1);
//Получаем параметры меток безопаности
SecLab := MObj.SecurityDescriptor.LabelSecurity;
//Права на изменение данных первого элемента
AccessMask := Element.Access(RdsAccessAttribute.WriteAccess);
BinMask := DecToBin(AccessMask);
For i := BinMask.Length To 1 Step - 1 Do
//Получаем бит из символьной строки и проверяем его значение
c := BinMask.Chars(i - 1);
//Если значение текущего бита - 1, то получаем пользователя сопоставленного с данным битом
If c = '1' Then
//Нумерация битов осуществляется справа налево. Для получения номера бита вычитаем
//текущую позицию из общей длины.
Debug.WriteLine(SecLab.Mapping(BinMask.Length - i).Name);
End If;
End For;
End Sub CheckMask;
При выполнении примера в консоль среды разработки будут выведены наименования субъектов безопасности, которые имеют права на изменение данных первого элемента справочника НСИ.
См. также: