Операции с сумками XACML

Предположим, у нас есть пакет логических значений. Есть ли функция, которая может определить, больше ли число «истинных» значений некоторой константы (например, 5)?

Я столкнулся с функцией "n-of", но она требует нескольких отдельных атрибутов в качестве входных данных, а не мешка... Возможно, функция "карта" может помочь, но не знаю, как, так как я не нашел функцию, которая может уменьшить количество предметов в мешке.

Спасибо! Майкл.


person Michael    schedule 21.03.2017    source источник


Ответы (1)


Чтобы достичь того, что вы ищете, вам нужно использовать две функции:

  • функция, которая измеряет размер сумки, например. booleanBagSize(someAttribute)
  • функция, проверяющая, что каждое значение мешка равно true. например booleanEquals используется в сочетании с функцией более высокого порядка, например. AllOf

Результирующий код в ALFA будет таким:

namespace axiomatics{
    attribute allowed{
        category = subjectCat
        id = "axiomatics.allowed"
        type = boolean
    }
    policy allowIf5True{
        apply firstApplicable
        rule allow{
            permit
            condition booleanBagSize(allowed)>5 && allOf(function[booleanEqual], true, allowed)
        }
    }
}

И вывод XACML 3.0 будет

<?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/axiomatics.allowIf5True"
    RuleCombiningAlgId="urn:oasis:names:tc:xacml:1.0:rule-combining-algorithm:first-applicable"
    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/axiomatics.allowIf5True.allow">
        <xacml3:Description />
        <xacml3:Target />
        <xacml3:Condition>
            <xacml3:Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:and">
                <xacml3:Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:integer-greater-than">
                    <xacml3:Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:boolean-bag-size" >
                        <xacml3:AttributeDesignator 
                            AttributeId="axiomatics.allowed"
                            DataType="http://www.w3.org/2001/XMLSchema#boolean"
                            Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject"
                            MustBePresent="false"
                        />
                    </xacml3:Apply>
                    <xacml3:AttributeValue
                        DataType="http://www.w3.org/2001/XMLSchema#integer">5</xacml3:AttributeValue>
                </xacml3:Apply>
                <xacml3:Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:all-of" >
                    <xacml3:Function FunctionId="urn:oasis:names:tc:xacml:1.0:function:boolean-equal"/>
                    <xacml3:AttributeValue
                        DataType="http://www.w3.org/2001/XMLSchema#boolean">true</xacml3:AttributeValue>
                    <xacml3:AttributeDesignator 
                        AttributeId="axiomatics.allowed"
                        DataType="http://www.w3.org/2001/XMLSchema#boolean"
                        Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject"
                        MustBePresent="false"
                    />
                </xacml3:Apply>
            </xacml3:Apply>
        </xacml3:Condition>
    </xacml3:Rule>
</xacml3:Policy>

Этот подход работает только в том случае, если сумка содержит только истинные значения.

person David Brossard    schedule 21.03.2017
comment
Спасибо за ответ Давид! Мой основной вариант использования — это когда сумка содержит не только истинные значения, но и ложные значения. Есть ли способ определить/подсчитать/проверить количество истинных значений, если в сумке есть несколько истинных и ложных значений? - person Michael; 21.03.2017
comment
Позвольте мне немного подумать. В Axiomatics Policy Server вы всегда можете написать собственную функцию, которая сделает это за вас. Однако, как правило, в XACML вас не волнует количество значений. Вы заботитесь об их присутствии. - person David Brossard; 21.03.2017
comment
Я хотел бы использовать только стандартную функцию XACML... Пожалуйста, дайте мне знать, если у вас есть идея, как это решить. Спасибо! - person Michael; 21.03.2017