0

我想用 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 的客户访问?

4

1 回答 1

1

据我了解您的要求,您需要基于上述 xml 模式应用 XACML 策略。示例 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>
于 2013-10-17T01:00:03.423 回答