Атрибутный метод разграничения доступа позволяет задавать права доступа на отдельные элементы табличного справочника НСИ.
Атрибут элемента задается в виде «OBJECT.ELEMENT.<идентификатор атрибута>». Идентификаторы атрибута содержатся на вкладке «Атрибуты» при открытии справочника на редактирование.
Примечание. Атрибут элемента задается только в дополнительном условии правила.
Операции над элементами справочника НСИ содержатся в перечислении DictionarySpecificRights.
Для получения подробной информации обратитесь к разделу «Права доступа на элементы справочников НСИ».
Рассмотрим пример запрета доступа пользователю на чтение элемента табличного справочника НСИ с ключом «1».
Для выполнения примера должны выполняться условия:
в менеджере безопасности содержится пользователь с наименованием «USER»;
в корне репозитория содержится табличный справочник НСИ с идентификатором «DICTIONARY» и объекты, которые входят в состав справочника:
база данных с идентификатором «60»;
таблица с идентификатором «TABLE».
установлен флажок «Элементы имеют атрибутные права доступа» в табличном справочнике НСИ.
Добавьте ссылки на системные сборки: ABAC, Metabase, ForeSystem (для примера на Fore.NET).
Sub UserProc;
Var
PolicyObject: IABACRootPolicyObject;
PolicySet: IABACPolicySet;
Policy: IABACPolicy;
Rules: IABACRules;
Rule: IABACRule;
MB: IMetabase;
MS: IMetabaseSecurity;
Lic: Object;
Begin
MB := MetabaseClass.Active;
//Получим лицензию для возможности работы с менеджером безопасности
Lic := MB.RequestLicense(UiLicenseFeatureType.Adm);
MS := MB.Security;
// Активируем использование атрибутного доступа
MS.Policy.AttributeBasedAccessControl := True;
// Получим структуру атрибутного доступа
PolicyObject := MB.Security.Policy.ABACRules;
// Очистим структуру атрибутного доступа и зададим новую
PolicyObject.Policies.Clear;
// Зададим алгоритм корневой политики атрибутного доступа - переопределение разрешением
PolicyObject.CombineAlgorithm := ABACCombineAlgorithm.PermitOverride;
// Добавим набор политик
PolicySet := PolicyObject.Policies.Add;
PolicySet.Name(MB.CurrentLocale) := "Набор политик для пользователя «USER»";
PolicySet.Target.AttributeId := "SUBJECT.NAME";
PolicySet.Target.Operation := ABACTargetOperation.Equal;
PolicySet.Target.AttributeValue := "USER";
PolicySet.CombineAlgorithm := ABACCombineAlgorithm.PermitOverride;
// Добавим политику для доступа базе данных с ключом «60»
Policy := PolicySet.Policies.Add;
Policy.Name(MB.CurrentLocale) := "Разрешение доступа к базе данных";
Policy.Target.AttributeId := "OBJECT.KEY";
Policy.Target.Operation := ABACTargetOperation.Equal;
Policy.Target.AttributeValue := 60;
Policy.CombineAlgorithm := ABACCombineAlgorithm.PermitOverride;
// Добавим правила на доступ к чтению данных и метаданных объекта
Rules := Policy.Rules;
Rule := Rules.Add;
Rule.Name(LocaleCodeID.Russian) := "Доступ на чтение данных";
Rule.Target.AttributeId := "OPERATION";
Rule.Target.Operation := ABACTargetOperation.IN_;
Rule.Target.AttributeValue := 2;
Rule.Effect := ABACRuleEffect.Permit;
Rule := Rules.Add;
Rule.Name(LocaleCodeID.Russian) := "Доступ на чтение метаданных";
Rule.Target.AttributeId := "OPERATION";
Rule.Target.Operation := ABACTargetOperation.Equal;
Rule.Target.AttributeValue := 4096;
Rule.Effect := ABACRuleEffect.Permit;
// Добавим политику для доступа к таблице с идентификатором «TABLE», используемой табличным справочником НСИ
Policy := PolicySet.Policies.Add;
Policy.Name(MB.CurrentLocale) := "Разрешение доступа к таблице";
Policy.Target.AttributeId := "OBJECT.ID";
Policy.Target.Operation := ABACTargetOperation.Equal;
Policy.Target.AttributeValue := "TABLE";
Policy.CombineAlgorithm := ABACCombineAlgorithm.PermitOverride;
// Добавим правило на полный доступ к таблице
Rules := Policy.Rules;
Rule := Rules.Add;
Rule.Name(LocaleCodeID.Russian) := "Полный доступ к таблице";
Rule.Target.AttributeId := "OPERATION";
Rule.Target.Operation := ABACTargetOperation.IN_;
Rule.Target.AttributeValue := 1;
Rule.Effect := ABACRuleEffect.Permit;
// Добавим политику для доступа к табличному справочнику НСИ с идентификатором «DICTIONARY»
Policy := PolicySet.Policies.Add;
Policy.Name(MB.CurrentLocale) := "Разрешение доступа к справочнику НСИ";
Policy.Target.AttributeId := "OBJECT.ID";
Policy.Target.Operation := ABACTargetOperation.Equal;
Policy.Target.AttributeValue := "DICTIONARY";
Policy.CombineAlgorithm := ABACCombineAlgorithm.PermitOverride;
// Добавим правило на полный доступ к табличному справочнику НСИ
Rules := Policy.Rules;
Rule := Rules.Add;
Rule.Name(LocaleCodeID.Russian) := "Полный доступ к справочнику НСИ";
Rule.Target.AttributeId := "OPERATION";
Rule.Target.Operation := ABACTargetOperation.IN_;
Rule.Target.AttributeValue := 1;
Rule.Effect := ABACRuleEffect.Permit;
// Добавим правило на запрет доступа к элементу справочника НСИ с ключом «1»
Rules := Policy.Rules;
Rule := Rules.Add;
Rule.Name(LocaleCodeID.Russian) := "Доступ к элементу справочника НСИ";
Rule.Target.AttributeId := "OPERATION";
Rule.Target.Operation := ABACTargetOperation.Equal;
Rule.Target.AttributeValue := 1048576;
Rule.Condition.AsString := "OBJECT.ELEMENT.KEY = 1";
Rule.Effect := ABACRuleEffect.Deny;
// Применим изменения в менеджере безопасности
MS.Apply;
// Освободим лицензию
Lic := Null;
End Sub UserProc;
Imports Prognoz.Platform.Interop.ABAC;
Imports Prognoz.Platform.Interop.Metabase;
Imports Prognoz.Platform.Interop.ForeSystem;
…
Public Shared Sub Main(Params: StartParams);
Var
PolicyObject: IABACRootPolicyObject;
PolicySet: IABACPolicySet;
Policy: IABACPolicy;
Rules: IABACRules;
Rule: IABACRule;
MB: IMetabase;
MS: IMetabaseSecurity;
Lic: Object;
Begin
MB := Params.Metabase;
//Получим лицензию для возможности работы с менеджером безопасности
Lic := MB.RequestLicense(UiLicenseFeatureType.lftAdm);
MS := MB.Security;
// Активируем использование атрибутного доступа
MS.Policy.AttributeBasedAccessControl := True;
// Получим структуру атрибутного доступа
PolicyObject := MB.Security.Policy.ABACRules;
// Очистим структуру атрибутного доступа и зададим новую
PolicyObject.Policies.Clear;
// Зададим алгоритм корневой политики атрибутного доступа - переопределение разрешением
PolicyObject.CombineAlgorithm := ABACCombineAlgorithm.abacrcaPermitOverride;
// Добавим набор политик
PolicySet := PolicyObject.Policies.Add();
PolicySet.Name[MB.CurrentLocale] := "Набор политик для пользователя «USER»";
PolicySet.Target.AttributeId := "SUBJECT.NAME";
PolicySet.Target.Operation := ABACTargetOperation.abactoEqual;
PolicySet.Target.AttributeValue := "USER";
PolicySet.CombineAlgorithm := ABACCombineAlgorithm.abacrcaPermitOverride;
// Добавим политику для доступа базе данных с ключом «60»
Policy := PolicySet.Policies.Add();
Policy.Name[MB.CurrentLocale] := "Разрешение доступа к базе данных";
Policy.Target.AttributeId := "OBJECT.KEY";
Policy.Target.Operation := ABACTargetOperation.abactoEqual;
Policy.Target.AttributeValue := 60;
Policy.CombineAlgorithm := ABACCombineAlgorithm.abacrcaPermitOverride;
// Добавим правила на доступ к чтению данных и метаданных объекта
Rules := Policy.Rules;
Rule := Rules.Add();
Rule.Name[MB.CurrentLocale] := "Доступ на чтение данных";
Rule.Target.AttributeId := "OPERATION";
Rule.Target.Operation := ABACTargetOperation.abactoIN;
Rule.Target.AttributeValue := 2;
Rule.Effect := ABACRuleEffect.abacrePermit;
Rule := Rules.Add();
Rule.Name[MB.CurrentLocale] := "Доступ на чтение метаданных";
Rule.Target.AttributeId := "OPERATION";
Rule.Target.Operation := ABACTargetOperation.abactoEqual;
Rule.Target.AttributeValue := 4096;
Rule.Effect := ABACRuleEffect.abacrePermit;
// Добавим политику для доступа к таблице с идентификатором «TABLE», используемой табличным справочником НСИ
Policy := PolicySet.Policies.Add();
Policy.Name[MB.CurrentLocale] := "Разрешение доступа к таблице";
Policy.Target.AttributeId := "OBJECT.ID";
Policy.Target.Operation := ABACTargetOperation.abactoEqual;
Policy.Target.AttributeValue := "TABLE";
Policy.CombineAlgorithm := ABACCombineAlgorithm.abacrcaPermitOverride;
// Добавим правило на полный доступ к таблице
Rules := Policy.Rules;
Rule := Rules.Add();
Rule.Name[MB.CurrentLocale] := "Полный доступ к таблице";
Rule.Target.AttributeId := "OPERATION";
Rule.Target.Operation := ABACTargetOperation.abactoIN;
Rule.Target.AttributeValue := 1;
Rule.Effect := ABACRuleEffect.abacrePermit;
// Добавим политику для доступа к табличному справочнику НСИ с идентификатором «DICTIONARY»
Policy := PolicySet.Policies.Add();
Policy.Name[MB.CurrentLocale] := "Разрешение доступа к справочнику НСИ";
Policy.Target.AttributeId := "OBJECT.ID";
Policy.Target.Operation := ABACTargetOperation.abactoEqual;
Policy.Target.AttributeValue := "DICTIONARY";
Policy.CombineAlgorithm := ABACCombineAlgorithm.abacrcaPermitOverride;
// Добавим правило на полный доступ к табличному справочнику НСИ
Rules := Policy.Rules;
Rule := Rules.Add();
Rule.Name[MB.CurrentLocale] := "Полный доступ к справочнику НСИ";
Rule.Target.AttributeId := "OPERATION";
Rule.Target.Operation := ABACTargetOperation.abactoIN;
Rule.Target.AttributeValue := 1;
Rule.Effect := ABACRuleEffect.abacrePermit;
// Добавим правило на запрет доступа к элементу справочника НСИ с ключом «1»
Rules := Policy.Rules;
Rule := Rules.Add();
Rule.Name[MB.CurrentLocale] := "Доступ к элементу справочника НСИ";
Rule.Target.AttributeId := "OPERATION";
Rule.Target.Operation := ABACTargetOperation.abactoEqual;
Rule.Target.AttributeValue := 1048576;
Rule.Condition.AsString := "OBJECT.ELEMENT.KEY = 1";
Rule.Effect := ABACRuleEffect.abacreDeny;
// Применим изменения в менеджере безопасности
MS.Apply();
// Освободим лицензию
Lic := Null;
End Sub;
В результате выполнения примера в менеджере безопасности будет активировано использование атрибутного доступа и добавлена заданная структура атрибутного доступа с запретом доступа пользователю на чтение элемента табличного справочника НСИ с ключом «1»:

При выполнении атрибутного доступа в навигаторе объектов для пользователя «USER» не будет отображаться элемент табличного справочника НСИ с ключом «1».
См. также:
Примеры | Права доступа на элементы справочников НСИ | Базовые настройки справочника