Я не могу понять, как написать правило, которое решало бы это требование:
Предположим, у меня есть такой запрос:
<Request>
<Attributes Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject">
<Content>
<Categories>
<Category name="cat1">
<CategoryValue>A</CategoryValue>
<CategoryValue>B</CategoryValue>
<CategoryValue>C</CategoryValue>
</Category>
<Category name="cat2">
<CategoryValue>B</CategoryValue>
<CategoryValue>E</CategoryValue>
<CategoryValue>F</CategoryValue>
</Category>
</Categories>
</Content>
</Attributes>
<Attributes Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource">
<Content>
<Categories>
<Category name="cat1">
<CategoryValue>A</CategoryValue>
</Category>
<Category name="cat2">
<CategoryValue>A</CategoryValue>
<CategoryValue>E</CategoryValue>
<CategoryValue>F</CategoryValue>
<CategoryValue>G</CategoryValue>
</Category>
</Categories>
</Content>
</Attributes>
</Request>
Я хочу написать политику, содержащую правило с эффектом Разрешить, когда для каждого из Category
элементов ресурса субъект имеет Category
с одинаковыми @name
и если оба этих Category
элемента имеют по крайней мере один общий CategoryValue
.
В этом примере выше:
- У ресурса есть cat1 с A - у субъекта есть cat1 с одним значением A: Permit
- У ресурса есть cat2 с A, E, F, G - у субъекта есть cat2 со значением E (или F): Разрешить
- Конечный результат правила: разрешение
Мой вопрос не в том, какие functionId
мне следует использовать, а в том, как я могу объединить эти условия, чтобы правило вело себя так, как я описал? Как сравнить GenericValue
элементов узлов с одинаковым @name
?
Я думаю, мне придется использовать функцию string-at-least-one-member-of
между значениями объекта и ресурса «cat1», затем между субъектом и ресурсом «cat2», но настоящая трудность заключается в том, что PDP не имеет представления о @name
элементов Category
, поэтому я не могу жестко закодировать его прямо в правиле, и я не знаю, как выбрать их, в частности, для выполнения проверки.
Есть идеи по этому поводу?