2017-03-08 134 views
2

發送多個屬性的請求自定義策略信息點(PIP)我使用WSO2IS 5.3.0,我已經跟隨在本網站上的說明:https://docs.wso2.com/display/IS530/Writing+a+Custom+Policy+Info+PointWSO2身份服務器 - 在WSO2IS

我已經成功實現了自定義PIP屬性查找器(KMarketJDBCAttributeFinder),迄今爲止這麼好。我遇到的問題是我想發送多個屬性,但屬性查找器只能選擇一個。接下來,我的政策和要求:

XACML策略:

<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="My-Custom-Policy" 
     RuleCombiningAlgId="urn:oasis:names:tc:xacml:1.0:rule-combining-algorithm:first-applicable" 
     Version="1.0"> 
<Target> 
    <AnyOf> 
    <AllOf> 
     <Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-regexp-match"> 
     <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">subj-id</AttributeValue> 
     <AttributeDesignator 
       MustBePresent="false" 
       Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject" 
       AttributeId="urn:oasis:names:tc:xacml:1.0:subject:subject-id" 
       DataType="http://www.w3.org/2001/XMLSchema#string"/> 
     </Match> 
    </AllOf> 
    </AnyOf> 
</Target> 
<Rule RuleId="rule1" Effect="Permit"> 
    <Target> 
    <AnyOf> 
     <AllOf> 
     <Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal"> 
      <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">action-value</AttributeValue> 
      <AttributeDesignator 
        MustBePresent="false" 
        Category="urn:oasis:names:tc:xacml:3.0:attribute-category:action" 
        AttributeId="urn:oasis:names:tc:xacml:1.0:action:action-id" 
        DataType="http://www.w3.org/2001/XMLSchema#string"/> 
     </Match> 
     </AllOf> 
    </AnyOf> 
    </Target> 
    <Condition> 
    <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:any-of"> 
     <Function FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-equal"/> 
     <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">some-value-returned-by-custom-pip-finder-jar</AttributeValue> 
     <AttributeDesignator 
       Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource" 
       AttributeId="urn:my:custom:id:data-one" 
       DataType="http://www.w3.org/2001/XMLSchema#string" 
       MustBePresent="false"/> 
    </Apply> 
    </Condition> 
</Rule> 
<Rule RuleId="rule2" Effect="Deny"/> 
</Policy> 

XACML請求:

<Request xmlns="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17" CombinedDecision="false" ReturnPolicyIdList="false"> 
    <Attributes Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject"> 
     <Attribute AttributeId="urn:oasis:names:tc:xacml:1.0:subject:subject-id" IncludeInResult="false"> 
      <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">subj-id</AttributeValue> 
     </Attribute> 
    </Attributes> 

    <Attributes Category="urn:oasis:names:tc:xacml:3.0:attribute-category:action"> 
     <Attribute AttributeId="urn:oasis:names:tc:xacml:1.0:action:action-id" IncludeInResult="false"> 
      <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">action-value</AttributeValue> 
     </Attribute> 
    </Attributes> 

    <Attributes Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource"> 
     <Attribute AttributeId="urn:oasis:names:tc:xacml:1.0:resource:resource-id" IncludeInResult="false"> 
      <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">re-src-id</AttributeValue> 
     </Attribute> 
     <Attribute AttributeId="urn:my:custom:id:data-one" IncludeInResult="false"> 
      <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">data-one</AttributeValue> 
     </Attribute> 
     <Attribute AttributeId="urn:my:custom:id:data-two" IncludeInResult="false"> 
      <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">data-two</AttributeValue> 
     </Attribute> 
    </Attributes> 
</Request> 

正如你所看到的,我送三個屬性作爲資源類別的一部分;但是當我調試的代碼,我只能看到這些屬性中的一個拿起(其他被忽略)

此外,從我使用海關屬性Id的要求和政策:urn:my:custom:id:data-oneurn:my:custom:id:data-two

¿如何我可以發送多個屬性(不使用「多個請求」選項,我只發送一個請求),並確認所有屬性都可以通過我的自定義屬性查找器PIP擴展來正確獲取?

回答

0

分析負責從請求中提取屬性的Abstract類的代碼,創建屬性包的方法只挑選一個;這就是我的測試不起作用的方式。

我找到的解決方案是創建一個實現類PIPAttributeFinder我自己的抽象類,並從請求拿起所有的屬性:

... (other code) 

    List<String> resourceList = new ArrayList<String>(); 

    EvaluationResult resource = evaluationCtx.getAttribute(new URI("http://www.w3.org/2001/XMLSchema#string"), new URI("urn:oasis:names:tc:xacml:1.0:resource:resource-id"), issuer, new URI("urn:oasis:names:tc:xacml:3.0:attribute-category:resource")); 
    if (resource != null && resource.getAttributeValue() != null && resource.getAttributeValue().isBag()) { 
     key = (BagAttribute) resource.getAttributeValue(); 
     if (key.size() > 0) { 
      Iterator iterator = key.iterator(); 
      String encodeAttribute = ""; 
      while(iterator.hasNext()) { 
       AttributeValue attributeValue = (AttributeValue)iterator.next(); 
       encodeAttribute = attributeValue.encode(); 
       resourceList.add(encodeAttribute); 
      } 
      if (log.isDebugEnabled()) { 
       log.debug(String.format("Finding attributes for the resource %1$s", new Object[]{encodeAttribute})); 
      } 
      resourceId = "empty-value"; 
     } 
    } 

... (other code) 

    attributeValues = this.getAttributeValues(subjectId, resourceId, resourceList, actionId, environmentId, attributeId.toString(), issuer); 

... (other code) 

請記住,你需要修改的簽名方法getAttributeValues