WSOS标识 - 具有一组多个元素的PIP扩展返回空白

时间:2016-02-10 18:17:34

标签: wso2 identity xacml

我们的测试表明,WSO2 PIP扩展模块实现了与PDP集成(= AttributeFinder)连接的“Set”类。此界面目前只能传输一个元素。 一旦我们对组定义使用自定义查找,生成具有类型为String 的多个元素的Set,WSO2 PDP将返回空白字符串,但不提供任何信息。

来自WSO2的示例代码:

@Override
    public Set<String> getAttributeValues(String subject, String resource, String action,
                                  String environment, String attributeId, String issuer) throws Exception {

        Set<String> roles = new HashSet<String>();
        String role = findRole(subject);
        if(role != null){
            roles.add(role);
        }

        return roles;
    }    

PIP扩展示例下载源代码:

https://svn.wso2.org/repos/wso2/carbon/platform/trunk/components/identity/org.wso2.carbon.identity.samples.entitlement.pip/src/main/java/org/wso2/carbon/identity/samples/entitlement/pip/

我们的查找程序使用基于字符串的数据类型,该数据类型与元素的数据类型相匹配,请参阅下面的XACML代码: 。

<AttributeDesignator Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject" AttributeId="http://w3.red.com/subject/groupsUserBelong" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="false"></AttributeDesignator> 

访问组处理是XACML逻辑处理中非常常见的任务,因此这是实现XACML策略和规则的关键功能。

这种失败行为是一个错误(返回空白),还是WSO2 XACML使用多个字符串元素为一个集合提供程序化实现,根据数据元素的数量自动生成一个字符串包,每个元素一个字符串?

要完成分析,请查看上面的示例代码 作为名为AbstractPIPAttributeFinder的匹配抽象类。 两者都引用名为“roles”的返回值,而在抽象类中则将其描述为“values”。一旦将要返回的对象定义为Set并且字段名称以复数形式描述它,它基本上自我解释所传输的值可以是作为Set构造的一部分的一个或多个元素,通常是String数据的每个元素 - 类型。

逻辑适用于单个元素,使用时失败 多个元素,在XACML接口处返回一个“空白”字符串来代替“String-bag”。

1 个答案:

答案 0 :(得分:1)

在通过模块详细分析PIP数据流后,我们在PIP扩展程序中圈出了问题。您可以在下面找到用于寻址和传输数据字段的逻辑。新逻辑能够传输多个元素(例如组或角色),这些元素使用ObligationExpression以及String-bag比较进行测试,这些元素在部署新扩展代码后都成功执行。

public Set<String> getAttributeValues(String subject, String resource,
                String action, String environment, String attributeId, String issuer)
                throws Exception {

            Set<String> myHash = new HashSet<String>();
            Map<String, String> myMap = null;
            if (attributeId.trim().equalsIgnoreCase("http://w3.red.com/subject/versionOfPIP")) {
                myHash.add(myversion.toString().trim());
                System.out.println(myversion.toString().trim());

            } else if (attributeId.trim().equalsIgnoreCase("http://w3.red.com/subject/groupsUserBelong")) {
                String myGroups = RedRedGroupAttrFinder.
                        getOnlyGroups(RedRedGroupAttrFinder.redGroupHTTPsSlaphAPI(subject));
                ArrayList<String> myGroupsArrayL =RedRedGroupAttrFinder.convertStringToArraylist(myGroups);
                for (String element : myGroupsArrayL) {
                    myHash.add(element.toString().trim());
                    }

            } else if (attributeId.trim().equalsIgnoreCase("http://w3.red.com/subject/employeeCountryCode")) {
                myMap = LdapHash.searchRedPagesByIntranetEmail(subject);
                myHash.add(myMap.get(attributeId.substring(26).toString().trim()));

            } else {
                myHash.add("never");
            }

            return myHash;
        }
}