【问题标题】:Fine grained access control with XACML 3.0 for an XML document使用 XACML 3.0 对 XML 文档进行细粒度访问控制
【发布时间】:2013-10-16 15:50:22
【问题描述】:

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

【问题讨论】:

    标签: xpath authorization access-control xacml abac


    【解决方案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>
    

    【讨论】:

    • 感谢您的回答,如果客户有一个销售,这可能是有效的。但是我想处理一个有多个销售的客户的情况,你能帮我吗
    • 在这种情况下,您可以修改输入中的 xml 内容,如下所示:
    • 123410000 value> 并且您可以在策略中使用聚合 XPATH 函数 sum(例如 sum(/client/sales/value/text())来评估特定客户的所有销售价值的总和。