在粒度级别使用XACML的正确方法

时间:2014-12-22 14:55:40

标签: wso2 authorization access-control xacml alfa

我正在开发一个我们希望集中访问控制的项目。

当我们遇到如下情况时,我无法理解如何在访问控制中使用粒度:

  

医生只能访问分配给他的患者。

现在,我们可以有很多像这样的用例,还有一些动态案例可以说:

  

帐户部门无法看到患者的情况,但医生会改变状态   耐心地将他提供给会计部门。

然后如何处理这种动态随机变化。

1 个答案:

答案 0 :(得分:1)

在特定规则中引入condition

<Policy PolicyId="deny-apia" RuleCombiningAlgId="urn:oasis:names:tc:xacml:1.0:rule-combining-algorithm:first-applicable"
         xmlns="urn:oasis:names:tc:xacml:1.0:policy" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <Description>...</Description>
    <Target/>       
    <Rule RuleId="1" Effect="Permit">
        <Target>
            <Subjects>
        ...
            </Subjects>
            <Resources>
        ...
            </Resources>
            <Actions>
        ...
            </Actions>
            <Environment>
        ...
            </Environment>
        </Target>
        <Condition>
            <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:function:string-equal">

            </Apply>
        </Condition>
    </Rule>
    <Rule RuleId="DenyAllThatDidNotMatchPreviousRules" Effect="Deny"/>
</Policy>
  1. 如果医生通过上传同意来更改状态,则该规则 将适用,并且可以查看患者详细信息 部。
  2. 如果未获得同意,则该规则不适用 该成员拒绝访问患者详细信息 部。
  3. 如果医疗服务提供者撤销同意,则会撤销帐户部门的访问权限,并且该规则不再适用。
  4. XACML中的条件的另一个示例位于here

      <Policy PolicyId="SamplePolicy"
              RuleCombiningAlgId="urn:oasis:names:tc:xacml:1.0:rule-combining-algorithm:permit-overrides">
    
        <!-- This Policy only applies to requests on the SampleServer -->
        <Target>
          <Subjects>
            <AnySubject/>
          </Subjects>
          <Resources>
            <ResourceMatch MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal">
              <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">SampleServer</AttributeValue>
              <ResourceAttributeDesignator DataType="http://www.w3.org/2001/XMLSchema#string"
                                           AttributeId="urn:oasis:names:tc:xacml:1.0:resource:resource-id"/>
            </ResourceMatch>
          </Resources>
          <Actions>
            <AnyAction/>
          </Actions>
        </Target>
    
        <!-- Rule to see if we should allow the Subject to login -->
        <Rule RuleId="LoginRule" Effect="Permit">
    
          <!-- Only use this Rule if the action is login -->
          <Target>
            <Subjects>
              <AnySubject/>
            </Subjects>
            <Resources>
              <AnyResource/>
            </Resources>
            <Actions>
              <ActionMatch MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal">
                <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">login</AttributeValue>
                <ActionAttributeDesignator DataType="http://www.w3.org/2001/XMLSchema#string"
                                           AttributeId="ServerAction"/>
              </ActionMatch>
            </Actions>
          </Target>
    
          <!-- Only allow logins from 9am to 5pm -->
          <Condition FunctionId="urn:oasis:names:tc:xacml:1.0:function:and">
            <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:time-greater-than-or-equal"
              <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:time-one-and-only">
                <EnvironmentAttributeSelector DataType="http://www.w3.org/2001/XMLSchema#time"
                                              AttributeId="urn:oasis:names:tc:xacml:1.0:environment:current-time"/>
              </Apply>
              <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#time">09:00:00</AttributeValue>
            </Apply>
            <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:time-less-than-or-equal"
              <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:time-one-and-only">
                <EnvironmentAttributeSelector DataType="http://www.w3.org/2001/XMLSchema#time"
                                              AttributeId="urn:oasis:names:tc:xacml:1.0:environment:current-time"/>
              </Apply>
              <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#time">17:00:00</AttributeValue>
            </Apply>
          </Condition>
    
        </Rule>
    
        <!-- We could include other Rules for different actions here -->
    
        <!-- A final, "fall-through" Rule that always Denies -->
        <Rule RuleId="FinalRule" Effect="Deny"/>
    
      </Policy>
    

    注意在XACML文件的末尾添加拒绝规则,该规则拒绝与其中一个规则不匹配的所有内容。