IAccessControlList.AddAce

Синтаксис

AddAce(Type: AceType; Sid: ISid; AccessMask: Integer): IAccessControlEntry;

Параметры

Type. Тип создаваемого параметра.

Sid. Идентификатор субъекта безопасности.

AccessMask. Маска доступа, которая будет установлена.

Описание

Метод AddAce добавляет элемент контроля доступа.

Комментарий

Значение маски является 4-x байтовым двоичным числом, приведенным к десятичному виду. Для формирования значения маски необходимо использовать значения перечислимого типа MetabaseObjectPredefinedRights. В этом перечислении содержатся основные и дополнительные операции, на которые можно раздавать права и вести аудит доступа. Для определенных классов объектов доступны специфические операции. Для использования специфических операций, в зависимости от класса объекта, в маске можно использовать значения следующих перечислений:

Основные, дополнительные и специфические операции, доступные для определенных типов объектов, представлены в разделе Типы событий.

Пример

Для выполнения примера предполагается наличие в репозитории таблицы с идентификатором TABLE. Среди субъектов безопасности, созданных в менеджере безопасности текущего репозитория, имеется пользователь TestUser.

Добавьте ссылку на системную сборку Metabase.

Sub UserProc;
Var
    MB: IMetabase;
    MDesc: IMetabaseObjectDescriptor;
    SecDesc: ISecurityDescriptor;
    User: ISecuritySubject;
    Acl: IAccessControlList;
    Entry, AllowedEntry, DeniedEntry: IAccessControlEntry;
    AccessAllowed, AccessDenied: Integer;
Begin
    MB := MetabaseClass.Active;
    MDesc := MB.ItemById("Table_1");
    //Дескриптор безопасности объекта
    SecDesc := MDesc.SecurityDescriptor;
    //Пользователь, для которого необходимо изменить права доступа
    User := MB.Security.ResolveName("TestUser");
    SecDesc.Edit;
    //Дополнительные параметры безопасности
    Acl := SecDesc.Acl;
    //Формирование разрешающей и запрещающей маски:
    //Основные операции, которые будут разрешены
    AccessAllowed := MetabaseObjectPredefinedRights.Read;
    //Специфические операции, которые будут разрешены
    AccessAllowed := AccessAllowed Or
        TableSpecificRights.SelectRows Or
        TableSpecificRights.UpdateRows;
    //Основные операции, которые будут запрещены
    AccessDenied := MetabaseObjectPredefinedRights.WritePars Or
        MetabaseObjectPredefinedRights.WriteDescr;
    //Специфические операции, которые будут запрещены
    AccessDenied := AccessDenied Or
        TableSpecificRights.InsertRows Or
        TableSpecificRights.DeleteRows;
    //Поиск дополнительного параметра безопасности,
    //разрешающего операции для указанного пользователя
    For Each Entry In Acl Do
        If (Entry.Sid.AsString = User.Sid.AsString) And (Entry.Type = AceType.AccessAllowed) Then
            AllowedEntry := Entry;
        End If;
    End For;
    //Если параметр существует, то устанавливаем в нем сформированную маску,
    //иначе создаем новый дополнительный параметр безопасности
    If AllowedEntry <> Null Then
        AllowedEntry.AccessMask := AccessAllowed;
    Else
        Acl.AddAce(AceType.AccessAllowed, User.Sid, AccessAllowed);
    End If;
    //Поиск дополнительного параметра безопасности,
    //запрещающего операции для указанного пользователя
    For Each Entry In Acl Do
        If (Entry.Sid.AsString = User.Sid.AsString) And (Entry.Type = AceType.AccessDenied) Then
            DeniedEntry := Entry;
        End If;
    End For;
    //Если параметр существует, то устанавливаем в нем сформированную маску,
    //иначе создаем новый дополнительный параметр безопасности
    If DeniedEntry <> Null Then
        DeniedEntry.AccessMask := AccessDenied;
    Else
        Acl.AddAce(AceType.AccessDenied, User.Sid, AccessDenied);
    End If;
    SecDesc.Apply(True);
End Sub UserProc;

После выполнения примера для указанного объекта будут изменены элементы контроля доступа. Если в элементах контроля доступа объекта имеются параметры, определяющие права доступа для пользователя TestUser, то они будут изменены. Если соответствующих параметров нет, то они будут созданы. Разрешающая и запрещающая маска доступа формируются в переменных AccessAllowed и AccessDenied соответственно.

См. также:

IAccessControlList