Это отличный вопрос, и я рад видеть, что вы также используете ALFA.Позвольте мне пролить некоторый свет на это.
Запрос
Прежде всего, в запросе XACML отправка атрибута в виде двух отдельных атрибутов аналогична отправке его в качестве одного атрибута.Например, следующие два запроса одинаковы.
Может ли Алиса клиент, который также является сотрудником, просмотреть страховой полис 123?
Пример запроса 1
<?xml version="1.0" encoding="UTF-8"?><xacml-ctx:Request ReturnPolicyIdList="true" CombinedDecision="false" xmlns:xacml-ctx="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17">
<xacml-ctx:Attributes Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject" >
<xacml-ctx:Attribute AttributeId="com.axiomatics.user.type" IncludeInResult="true">
<xacml-ctx:AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">customer</xacml-ctx:AttributeValue>
</xacml-ctx:Attribute>
<xacml-ctx:Attribute AttributeId="com.axiomatics.user.type" IncludeInResult="true">
<xacml-ctx:AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">employee</xacml-ctx:AttributeValue>
</xacml-ctx:Attribute>
<xacml-ctx:Attribute AttributeId="urn:oasis:names:tc:xacml:1.0:subject:subject-id" IncludeInResult="true">
<xacml-ctx:AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">alice</xacml-ctx:AttributeValue>
</xacml-ctx:Attribute>
</xacml-ctx:Attributes>
<xacml-ctx:Attributes Category="urn:oasis:names:tc:xacml:3.0:attribute-category:action" >
<xacml-ctx:Attribute AttributeId="urn:oasis:names:tc:xacml:1.0:action:action-id" IncludeInResult="true">
<xacml-ctx:AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">view</xacml-ctx:AttributeValue>
</xacml-ctx:Attribute>
</xacml-ctx:Attributes>
<xacml-ctx:Attributes Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource" >
<xacml-ctx:Attribute AttributeId="com.axiomatics.resource.type" IncludeInResult="true">
<xacml-ctx:AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">insurance policy</xacml-ctx:AttributeValue>
</xacml-ctx:Attribute>
<xacml-ctx:Attribute AttributeId="com.axiomatics.policy.polId" IncludeInResult="true">
<xacml-ctx:AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">123</xacml-ctx:AttributeValue>
</xacml-ctx:Attribute>
</xacml-ctx:Attributes>
</xacml-ctx:Request>
Пример запроса 2
<?xml version="1.0" encoding="UTF-8"?><xacml-ctx:Request ReturnPolicyIdList="true" CombinedDecision="false" xmlns:xacml-ctx="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17">
<xacml-ctx:Attributes Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject" >
<xacml-ctx:Attribute AttributeId="com.axiomatics.user.type" IncludeInResult="true">
<xacml-ctx:AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">customer</xacml-ctx:AttributeValue>
<xacml-ctx:AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">employee</xacml-ctx:AttributeValue>
</xacml-ctx:Attribute>
<xacml-ctx:Attribute AttributeId="urn:oasis:names:tc:xacml:1.0:subject:subject-id" IncludeInResult="true">
<xacml-ctx:AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">alice</xacml-ctx:AttributeValue>
</xacml-ctx:Attribute>
</xacml-ctx:Attributes>
<xacml-ctx:Attributes Category="urn:oasis:names:tc:xacml:3.0:attribute-category:action" >
<xacml-ctx:Attribute AttributeId="urn:oasis:names:tc:xacml:1.0:action:action-id" IncludeInResult="true">
<xacml-ctx:AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">view</xacml-ctx:AttributeValue>
</xacml-ctx:Attribute>
</xacml-ctx:Attributes>
<xacml-ctx:Attributes Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource" >
<xacml-ctx:Attribute AttributeId="com.axiomatics.resource.type" IncludeInResult="true">
<xacml-ctx:AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">insurance policy</xacml-ctx:AttributeValue>
</xacml-ctx:Attribute>
<xacml-ctx:Attribute AttributeId="com.axiomatics.policy.polId" IncludeInResult="true">
<xacml-ctx:AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">123</xacml-ctx:AttributeValue>
</xacml-ctx:Attribute>
</xacml-ctx:Attributes>
</xacml-ctx:Request>
Атрибутами являются сумки
В XACML атрибутом всегда является сумка.Он всегда многозначен, даже если он содержит ноль или одно значение.Это означает, что если вы хотите работать с атрибутом, вы должны помнить, что это сумка.Например, если вы хотите объединить рынок со слайсом, вам нужно либо преобразовать его в одно значение (и это работает только в том случае, если это действительно одно значение), либо использовать функции более высокого порядка.Функция более высокого порядка - это функция, которая принимает в качестве параметра другую функцию, например, AllOf.
Конкатенация многозначных атрибутов
Можно использовать stringConcatenate, но эта функция работает только с атомарными значениями.,Вы можете использовать карту, чтобы применить ее к сумке, но, к сожалению, в вашем случае вам понадобится карта, способная работать с несколькими сумками.
Решение: использование нескольких запросов на принятие решения
Вместо отправкивсе значения в одном запросе, вы можете использовать Multiple Decision Profile (MDP), который позволяет отправлять несколько запросов за один раз, например:
Может ли Алиса просматривать, редактировать, удалите запись 1,2,3?
Ответ будет содержать столько же решений, сколько произведение комбинаций (в данном случае 1x3x3).
В вашем случае вы быобъединить все решения в одно.Если все Разрешить, то Разрешить еще Отказать.В MDP есть параметр для этого.Она называется CombinedDecision .
. Имея это в виду, вот как будет выглядеть политика (с использованием записи ALFA ):
namespace com.axiomatics{
attribute product{
category = resourceCat
id = "product"
type = string
}
attribute market{
category = resourceCat
id = "market"
type = string
}
attribute slice{
category = resourceCat
id = "slice"
type = string
}
attribute productMarketSliceAccess{
category = subjectCat
id = "product-market-slice-access"
type = string
}
policy userAccessProductMarketSlice{
apply firstApplicable
rule allowAccess{
permit
condition stringIsIn(stringOneAndOnly(product)+
stringOneAndOnly(market)+
stringOneAndOnly(slice),productMarketSliceAccess)
}
}
}
ПримерЗапрос - MDP
{
"Request": {
"CombinedDecision": true,
"AccessSubject": {
"Attribute": [
{
"AttributeId": "product-market-slice-access",
"Value": "BAC"
},
{
"AttributeId": "product-market-slice-access",
"Value": "DEF"
}
]
},
"Resource": [{
"Attribute": [
{
"AttributeId": "market",
"Value": "A"
},
{
"AttributeId": "product",
"Value": "B"
},
{
"AttributeId": "slice",
"Value": "C"
}
]
},{
"Attribute": [
{
"AttributeId": "market",
"Value": "E"
},
{
"AttributeId": "product",
"Value": "D"
},
{
"AttributeId": "slice",
"Value": "F"
}
]
}],
"Action": {
"Attribute": []
},
"Environment": {
"Attribute": []
}
}
}