Детализированный контроль доступа с XACML 3.0 для XML-документа

Я хочу описать вариант использования детализированного управления доступом с помощью XACML 3.0 для XML-документа, но я не знаю, могу ли я использовать полное выражение XPath, например

for $a in fn:distinct-values(sales/clientid)return (fn:sum(sales[clientid = $a]/value)

Это мой XML:

<?xml version="1.0"?>
<database>
    <sales>
        <salesid>1</salesid>
        <clientid>1</clientid>
        <value>1000</value>
    </sales>
    <sales>
        <salesid>2</salesid>
        <clientid>1</clientid>
        <value>10000</value>
    </sales>
    <sales>
        <salesid>3</salesid>
        <clientid>2</clientid>
        <value>500</value>
    </sales>
    <client>
        <clientid>1</clientid>
        <nom>a</nom>
    </client>
    <client>
        <clientid>2</clientid>
        <nom>b</nom>
    </client>
</database>

Как я могу ограничить доступ для клиентов, чей объем продаж меньше 10 000?


person Mars    schedule 16.10.2013    source источник


Ответы (1)


Насколько я понимаю ваше требование, вам необходимо применить политику XACML на основе схемы xml, как описано выше. Образец xml должен быть в запросе XACML, иначе, если вы планируете читать из xml в качестве репозитория, вам может потребоваться написать собственный PIP.

Вы можете достичь дизайна политики на основе XPath для того же самого, при условии, что ввод xml для сведений о клиенте доступен в запросе XACML внутри элемента, как показано в примере ниже:

<Attributes Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource">
 <Content>
  <client id="xxxx">
   <sales id="yyyy">
    <value>1234</value>
   </sales>
  </client>
 </Content>
</Attributes>

Затем вы можете создать политику на основе вашего варианта использования, как показано ниже:

<Policy xmlns="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17" xmlns:xacml="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17" PolicyId="sample-xpath-policy" RuleCombiningAlgId="urn:oasis:names:tc:xacml:1.0:rule-combining-algorithm:first-applicable"         Version="1.0">
<Description>Sample XPath policy</Description>
<PolicyDefaults>
<XPathVersion>http://www.w3.org/TR/1999/REC-xpath-19991116</XPathVersion>
</PolicyDefaults>
<Rule Effect="Permit" RuleId="Rule-1">
<Target>
<AnyOf>
<AllOf>
<Match MatchId="urn:oasis:names:tc:xacml:1.0:function:integer-less-than">
<AttributeValue DataType="http://www.w3.org/2001/XMLSchema#integer">10000</AttributeValue><AttributeSelector MustBePresent="false" Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource"  Path="/client/sales/value/text()" DataType="http://www.w3.org/2001/XMLSchema#integer"/>
</Match>
</AllOf>
</AnyOf>
</Target>
</Rule>
<Rule RuleId="rule2" Effect="Deny">
<Description>Deny rule</Description>
</Rule>
</Policy>
person Yusuf Khan    schedule 17.10.2013
comment
Спасибо за ответ, это может быть актуально, если у клиента одна продажа. Но я хочу рассмотреть случай с клиентом, у которого несколько продаж, не могли бы вы мне помочь? - person Mars; 17.10.2013
comment
В этом случае вы можете изменить свой xml-контент во входных данных, как показано ниже: - person Yusuf Khan; 18.10.2013
comment
‹Client id = xxxx› ‹sales id = yyyy› ‹value› 1234 ‹/value› ‹/sales› ‹sales id = zzzz› ‹value› 10000 ‹/value› ‹/sales› ‹/client› И вы можете использовать агрегированная сумма функции XPATH (например, сумма (/ client / sales / value / text ()) в политике для оценки суммы всей стоимости продаж для конкретного клиента. - person Yusuf Khan; 18.10.2013