Тот факт, что оба существуют, является особенностью языка. Вы можете представить себе язык с листовым элементом (правилом) и ветвью (политикой).
И Policy, и PolicySet очень похожи. При моделировании в XACML вы можете ассимилировать их.
У вас была бы политика, которая может содержать правила XOR других политик, но не оба одновременно
РЕДАКТИРОВАТЬ
После редактирования OP, вот немного больше контекста.
Структурные элементы XACML
XACML представляет 3 структурных элемента:
- PolicySet (PS)
- Политика (P)
- Правитель)
Как указано в OP, PolicySet может содержать Policy и PolicySet, что позволяет создать общее дерево настолько глубоким, насколько это хочет автор (PS -> PS -> PS ... -> P -> R) .
Содержание PolicySet, Policy и Rule
Все три элемента (PS, P, R) могут содержать:
- Целевые элементы: цель - это то, что определяет область действия элемента. Цель состоит из структуры И / ИЛИ / И и совпадений атрибутов, например
role=='manager' OR role=='editor'
.
- Обязательства и совет: обязательства и совет - это утверждения, которые возвращаются вместе с решением от PDP (точка принятия решения о политике) обратно в PEP (точка применения политики).
Объединение алгоритмов
Поскольку элементы PolicySet и Policy могут содержать дочерние элементы, им необходим механизм для разрешения конфликтов между дочерними элементами. Этот механизм называется алгоритмом комбинирования. Следовательно, как элементы PolicySet, так и элементы Policy обладают свойством комбинирующего алгоритма. Поскольку наборы политик содержат другие наборы политик и / или элементы политики, алгоритм комбинирования в наборе политик называется алгоритмом комбинирования политик. Поскольку элементы политики содержат только правила, алгоритм объединения называется алгоритмом объединения правил.
Еще одна особенность XACML заключается в том, что список алгоритмов комбинирования для политик почти такой же, как и для правил. Заметные различия:
- only-one-apply существует только для политик.
- on-permission-apply-second существует только для политик.
Вот список в нотации ALFA (ALFA - это псевдоязык, разработанный Axiomatics для упрощения разработки политики XACML):
namespace System {
ruleCombinator denyOverrides = "urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:deny-overrides"
ruleCombinator permitOverrides = "urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:permit-overrides"
ruleCombinator firstApplicable = "urn:oasis:names:tc:xacml:1.0:rule-combining-algorithm:first-applicable"
ruleCombinator orderedDenyOverrides = "urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:ordered-deny-overrides"
ruleCombinator orderedPermitOverrides = "urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:ordered-permit-overrides"
ruleCombinator denyUnlessPermit = "urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:deny-unless-permit"
ruleCombinator permitUnlessDeny = "urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:permit-unless-deny"
policyCombinator denyOverrides = "urn:oasis:names:tc:xacml:3.0:policy-combining-algorithm:deny-overrides"
policyCombinator permitOverrides = "urn:oasis:names:tc:xacml:3.0:policy-combining-algorithm:permit-overrides"
policyCombinator firstApplicable = "urn:oasis:names:tc:xacml:1.0:policy-combining-algorithm:first-applicable"
policyCombinator onlyOneApplicable = "urn:oasis:names:tc:xacml:1.0:policy-combining-algorithm:only-one-applicable"
policyCombinator orderedDenyOverrides = "urn:oasis:names:tc:xacml:3.0:policy-combining-algorithm:ordered-deny-overrides"
policyCombinator orderedPermitOverrides = "urn:oasis:names:tc:xacml:3.0:policy-combining-algorithm:ordered-permit-overrides"
policyCombinator denyUnlessPermit = "urn:oasis:names:tc:xacml:3.0:policy-combining-algorithm:deny-unless-permit"
policyCombinator permitUnlessDeny = "urn:oasis:names:tc:xacml:3.0:policy-combining-algorithm:permit-unless-deny"
policyCombinator onPermitApplySecond = "urn:oasis:names:tc:xacml:3.0:policy-combining-algorithm:on-permit-apply-second"
}
Цели и условия
Цели
Как указывалось ранее, элементы Target могут существовать в любом из PolicySet, Policy и Rule. Цель имеет заданную структуру элементов И / ИЛИ / И для объединения вместе совпадений атрибутов, то есть сравнения заданного атрибута с заданным значением. XACML предоставляет длинный список функций, которые можно использовать.
В цели могут использоваться только функции, которые принимают 2 атомарных значения и возвращают логическое значение, например. == (или urn: oasis: names: tc: xacml: 1.0: function: string-equal). Другие функции, например sum (urn: oasis: names: tc: xacml: 1.0: function: integer-add) использовать нельзя.
Условия
В частности, есть одна действительно полезная вещь, которую целевые элементы делать не могут: сравнивать два атрибута вместе, т.е. устанавливать связь. Представьте, например, что вы хотите написать Политику, которая гласит:
Врачи могут просматривать медицинскую карту пациента, к которому они приписаны.
Или, другими словами, Permit if userId == assignedDoctorId
.
Здесь вступают в силу элементы Condition. Condition - это выражение, которое может использовать любую функцию, доступную в XACML. Общий результат Condition должен быть логическим, но теперь вы можете делать такие вещи, как sum(age, limit)>5
или userId == assignedDoctorId
.
И вот еще одна причуда: элементы Condition могут использоваться только внутри элемента Rule. Итак, если вы хотите выразить отношения в XACML, вам понадобится хотя бы одно правило. И поскольку элемент правила не может существовать сам по себе. У вас должен быть хотя бы один элемент политики.
Итак, минимально возможная политика XACML (с использованием ALFA):
namespace example{
policy policyExample{
apply denyOverrides
rule allowAll{
permit
}
}
}
И результирующий XML-код XACML:
<?xml version="1.0" encoding="UTF-8"?>
<!--This file was generated by the ALFA Plugin for Eclipse from Axiomatics AB (http://www.axiomatics.com).
Any modification to this file will be lost upon recompilation of the source ALFA file-->
<xacml3:Policy xmlns:xacml3="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17"
PolicyId="http://axiomatics.com/alfa/identifier/example.policyExample"
RuleCombiningAlgId="urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:deny-overrides"
Version="1.0">
<xacml3:Description />
<xacml3:PolicyDefaults>
<xacml3:XPathVersion>http://www.w3.org/TR/1999/REC-xpath-19991116</xacml3:XPathVersion>
</xacml3:PolicyDefaults>
<xacml3:Target />
<xacml3:Rule
Effect="Permit"
RuleId="http://axiomatics.com/alfa/identifier/example.policyExample.allowAll">
<xacml3:Description />
<xacml3:Target />
</xacml3:Rule>
</xacml3:Policy>
person
David Brossard
schedule
25.12.2015