WSOS 身份 - 具有一组多个元素的 PIP 扩展 Returns 空白
WSOS Identity - PIP Extension with a Set of Multiple Elements Returns Blank
我们的测试表明 WSO2 PIP 扩展模块实现了 "Set" class 与 PDP 集成(=AttributeFinder)的连接。该接口目前只能传输一个元素。
一旦我们为我们的组定义使用自定义查找,生成一个具有 多个类型 String 元素的集合,WSO2 PDP returns a blank 没有信息的字符串。
来自 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 扩展示例下载源:
我们的查找程序使用基于字符串的数据类型,它与元素的数据类型相匹配,请参见下面的 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策略和规则的关键功能。
这个失败行为是一个错误(returns 空白),还是 WSO2 XACML 提供了一个使用多个字符串元素的集合的编程实现,根据数据的数量自动生成一个字符串包元素,每个元素一个字符串?
要完成分析,请同时检查上面的示例代码
作为名为 AbstractPIIPAttributeFinder 的匹配摘要 class。
两者都引用名为 "roles" 的 return 值,在摘要 class 中它被描述为 "values"。一旦 return 的对象被定义为一个 Set 并且字段名称以复数形式描述它,它基本上自我解释传输的值可以是一个或多个元素,它们是 Set 构造的一部分,通常是每个元素字符串数据类型。
该逻辑适用于单个元素,但在使用时失败
多个元素,在 XACML 接口 return 中用 "blank" 字符串代替 "String-bag"。
通过模块详细分析了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;
}
}
我们的测试表明 WSO2 PIP 扩展模块实现了 "Set" class 与 PDP 集成(=AttributeFinder)的连接。该接口目前只能传输一个元素。 一旦我们为我们的组定义使用自定义查找,生成一个具有 多个类型 String 元素的集合,WSO2 PDP returns a blank 没有信息的字符串。
来自 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 扩展示例下载源:
我们的查找程序使用基于字符串的数据类型,它与元素的数据类型相匹配,请参见下面的 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策略和规则的关键功能。
这个失败行为是一个错误(returns 空白),还是 WSO2 XACML 提供了一个使用多个字符串元素的集合的编程实现,根据数据的数量自动生成一个字符串包元素,每个元素一个字符串?
要完成分析,请同时检查上面的示例代码 作为名为 AbstractPIIPAttributeFinder 的匹配摘要 class。 两者都引用名为 "roles" 的 return 值,在摘要 class 中它被描述为 "values"。一旦 return 的对象被定义为一个 Set 并且字段名称以复数形式描述它,它基本上自我解释传输的值可以是一个或多个元素,它们是 Set 构造的一部分,通常是每个元素字符串数据类型。
该逻辑适用于单个元素,但在使用时失败 多个元素,在 XACML 接口 return 中用 "blank" 字符串代替 "String-bag"。
通过模块详细分析了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;
}
}