Управление правами доступа к элементам

Для выполнения примера предполагается наличие репозитория НСИ - "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(NullAs 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;

При выполнении примера в консоль среды разработки будут выведены наименования субъектов безопасности, которые имеют права на изменение данных первого элемента справочника НСИ.

См. также:

Примеры