Механизм работы данного метода представлен в подразделе «Настройка метода разграничения доступа по уровням».
При разграничении доступа по уровням используются такие же уровни, которые используются при мандатном доступе. При этом не используются категории. Для доступа к уровням используйте свойство IMetabaseMandatoryAccess.Category с указанием индекса 0.
Для включения/выключения использования разграничения по уровням используйте флаг IMetabaseMandatoryAccess.IsSimple. При включении использования уровней безопасности сразу будут созданы четыре уровня с метками критичности 0-3. При необходимости список уровней может быть расширен.
Предположим, что в репозитории уже созданы три пользователя с помощью кода, представленного в подразделе «Субъекты безопасности». Для включения разграничения доступа по уровням и сопоставления уровней пользователям выполните следующий код:
Sub EnableLevelsAccessControl;
Var
Mb: IMetabase;
MbSec: IMetabaseSecurity;
Executor, Manager, Owner: IMetabaseUser;
Mandatory: IMetabaseMandatoryAccess;
Category: ISecurityCategory;
Lic: Object;
Begin
Mb := MetabaseClass.Active;
// Получение лицензии для возможности работы с менеджером безопасности
Lic := Mb.RequestLicense(UiLicenseFeatureType.Adm);
// Менеджер безопасности
MbSec := Mb.Security;
// Использовать разграничения доступа по уровням
Mandatory := MbSec.Policy.MandatoryAccess;
Mandatory.IsSimple := True;
// Пользователи, для которых настраиваются уровни доступа
Executor := MbSec.ResolveName("Executor") As IMetabaseUser;
Manager := MbSec.ResolveName("Manager") As IMetabaseUser;
Owner := MbSec.ResolveName("Owner") As IMetabaseUser;
// Категория мандатного доступа
Category := Mandatory.Category(0);
// Сопоставление пользователям уровней доступа
Executor.Token.ClassificationLabel(Category) := Category.FindLevelByLabel(3);
Manager.Token.ClassificationLabel(Category) := Category.FindLevelByLabel(2);
Owner.Token.ClassificationLabel(Category) := Category.FindLevelByLabel(1);
// Применить изменения
MbSec.Apply;
// Освобождение лицензии
Lic := Null;
End Sub EnableLevelsAccessControl;
Предположим, в репозитории имеется папка, в которой расположен куб и все объекты, от которых он зависит. На базе куба создан регламентный отчёт. Для сопоставления уровней объектам репозитория выполните следующий код:
Sub SetObjectsLevel;
Var
Mb: IMetabase;
MbSec: IMetabaseSecurity;
MandatoryAccess: IMetabaseMandatoryAccess;
Category: ISecurityCategory;
CubeDesc: IMetabaseObjectDescriptor;
Folder, Cube, Report: ISecurityDescriptor;
Lic: Object;
Begin
Mb := MetabaseClass.Active;
// Получим лицензию для возможности работы с менеджером безопасности
Lic := Mb.RequestLicense(UiLicenseFeatureType.Adm);
// Менеджер безопасности
MbSec := Mb.Security;
// Категория мандатного доступа
MandatoryAccess := MbSec.Policy.MandatoryAccess;
Category := MandatoryAccess.Category(0);
// Сопоставление объектам уровней мандатного доступа
//---Регламентный отчёт---
Report := Mb.ItemById("REPORT").SecurityDescriptor;
Report.Edit;
Report.AccessToken.ClassificationLabel(Category) := Category.FindLevelByLabel(3);
Report.Apply(False);
//---Куб и все объекты, от которых он зависит---
CubeDesc := Mb.ItemById("STD_CUBE");
Cube := CubeDesc.SecurityDescriptor;
Cube.Edit;
Cube.AccessToken.ClassificationLabel(Category) := Category.FindLevelByLabel(2);
Cube.Apply(False);
ApplyAccessToDependence(CubeDesc.Dependencies(False), Category, Cube.AccessToken.ClassificationLabel(Category));
//---Папка---
Folder := Mb.ItemById("FOLDER").SecurityDescriptor;
Folder.Edit;
Folder.AccessToken.ClassificationLabel(Category) := Category.FindLevelByLabel(1);
// Не применяем установку уровня доступа по всей иерархии папки,
// чтобы не сбросить установленные ранее уровни доступа у объектов внутри папки
Folder.Apply(False);
// Освободим лицензию
Lic := Null;
End Sub SetObjectsLevel;
Sub ApplyAccessToDependence(MDescs: IMetabaseObjectDescriptors; Category: ISecurityCategory; Level: ISecurityLevel);
Var
MDesc: IMetabaseObjectDescriptor;
SecDesc: ISecurityDescriptor;
Begin
For Each MDesc In MDescs Do
SecDesc := MDesc.SecurityDescriptor;
SecDesc.Edit;
SecDesc.AccessToken.ClassificationLabel(Category) := Level;
SecDesc.Apply(False);
// Рекурсивный обход всех объектов, от которых может зависеть текущий объект
If MDesc.Dependencies(False).Count > 0 Then
ApplyAccessToDependence(MDesc.Dependencies(False), Category, Level);
End If;
End For;
End Sub ApplyAccessToDependence;
См. также: