WSO2IS - 具有自定义属性的 XACML 策略正在返回 "Couldn't find AttributeDesignator"
WSO2IS - XACML Policy with custom attributes is returning "Couldn't find AttributeDesignator"
我在 WSO2IS 中创建了以下策略:
<Policy xmlns="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17" PolicyId="check-blacklist-users-in-login" 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-equal">
<AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">login</AttributeValue>
<AttributeDesignator AttributeId="urn:custom:company:1.0:operation:login-id"
Category="urn:custom:company:1.0:attribute-category:operation"
DataType="http://www.w3.org/2001/XMLSchema#string"
MustBePresent="true"/>
</Match>
</AllOf>
</AnyOf>
</Target>
<Rule Effect="Permit" RuleId="permit-blacklisted-users-with-step-up">
<Target>
<AnyOf>
<AllOf>
<Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal">
<AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">vip</AttributeValue>
<AttributeDesignator AttributeId="urn:custom:company:1.0:user-group:vip-id"
Category="urn:custom:company:1.0:attribute-category:user-group"
DataType="http://www.w3.org/2001/XMLSchema#string"
MustBePresent="true"/>
</Match>
</AllOf>
</AnyOf>
</Target>
<Condition>
<Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-equal">
<Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-one-and-only">
<AttributeDesignator AttributeId="urn:custom:company:1.0:is-user-in-blacklist:is-user-in-blacklist-id"
Category="urn:custom:company:1.0:attribute-category:is-user-in-blacklist"
DataType="http://www.w3.org/2001/XMLSchema#string"
MustBePresent="true"/>
</Apply>
<AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">true</AttributeValue>
</Apply>
</Condition>
<ObligationExpressions>
<ObligationExpression FulfillOn="Permit" ObligationId="extra-email">
<AttributeAssignmentExpression AttributeId="extra-email">
<AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">send-email</AttributeValue>
</AttributeAssignmentExpression>
</ObligationExpression>
</ObligationExpressions>
</Rule>
</Policy>
但是当我发送以下 XACML 请求时:
<Request xmlns="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17" CombinedDecision="false" ReturnPolicyIdList="false">
<Attributes Category="urn:custom:company:1.0:attribute-category:operation">
<Attribute AttributeId="urn:custom:company:1.0:operation:login-id" IncludeInResult="false">
<AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">login</AttributeValue>
</Attribute>
</Attributes>
<Attributes Category="urn:custom:company:1.0:attribute-category:user-group">
<Attribute AttributeId="urn:custom:company:1.0:user-group:vip-id" IncludeInResult="false">
<AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">vip</AttributeValue>
</Attribute>
</Attributes>
<Attributes Category="urn:custom:company:1.0:attribute-category:is-user-in-blacklist">
<Attribute AttributeId="urn:custom:company:1.0:users:user-id" IncludeInResult="false">
<AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">userJon</AttributeValue>
</Attribute>
</Attributes>
</Request>
我总是收到有关 AttributeDesignator 的不确定错误:
<Response xmlns="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17">
<Result>
<Decision>Indeterminate</Decision>
<Status>
<StatusCode Value="urn:oasis:names:tc:xacml:1.0:status:processing-error"/>
<StatusMessage>Couldn't find AttributeDesignator attribute</StatusMessage>
</Status>
</Result>
</Response>
我使用以下代码创建了自定义 PIPAttributeFinder:
public class DatabaseAttributeFinder extends LoginDBAttributeFinder {
private DataSource dataSource;
private Set<String> supportedAttributes = new HashSet<String>();
private static Log log = LogFactory.getLog(DatabaseAttributeFinder.class);
private static final String BLACKLISTED_USER_ID = "urn:custom:company:1.0:is-user-in-blacklist:is-user-in-blacklist-id";
@Override
public void init(Properties properties) throws Exception {
String dataSourceName = (String) properties.get("DataSourceName");
if(dataSourceName == null || dataSourceName.trim().length() == 0){
throw new Exception("Data source name can not be null. Please configure it in the entitlement.properties file.");
}
dataSource = (DataSource) InitialContext.doLookup(dataSourceName);
supportedAttributes.add(BLACKLISTED_USER_ID);
}
... (other code)
而 class LoginDBAttributeFinder,看起来像这样:
public abstract class LoginDBAttributeFinder implements PIPAttributeFinder {
protected int tenantId;
private boolean isAbstractAttributeCachingEnabled = false;
private PIPAbstractAttributeCache abstractAttributeFinderCache = null;
private static Log log = LogFactory.getLog(LoginDBAttributeFinder.class);
public LoginDBAttributeFinder() {
}
public abstract Set<String> getAttributeValues(String blacklistUserId,
String attributeId,
String issuer) throws Exception;
@Override
public Set<String> getAttributeValues(URI attributeType, URI attributeId, URI category, String issuer, EvaluationCtx evaluationCtx) throws Exception {
String blacklistUserId = null;
Set attributeValues = null;
this.tenantId = CarbonContext.getThreadLocalCarbonContext().getTenantId();
EvaluationResult blacklistUser = evaluationCtx.getAttribute(new URI("http://www.w3.org/2001/XMLSchema#string"), new URI("urn:custom:company:1.0:users:user-id"), issuer, new URI("urn:custom:company:1.0:attribute-category:is-user-in-blacklist"));
attributeValues = this.getAttributeValues(blacklistUserId, attributeId.toString(), issuer);
return attributeValues;
... (other code)
我已经在 WSO2IS 中成功注册了 jar(它显示在管理控制台中)并且每当我进入 TryIt 选项并测试特定策略(检查黑名单用户登录)时它 returns 允许,但是当我转到 WSO2IS 控制台的侧边菜单 "Tools" 并使用通用 "TryIt" 工具时,它 returns 不确定(找不到 AttributeDesignator)。
它似乎找不到策略,因此找不到与该策略支持的属性相关的 AttributeDesignator。
我也尝试使用 REST API (https://WSO2ISIP:4443/api/identity/entitlement/decision/pdp),而且我得到:不确定(无法找到 AttributeDesignator)
关于如何解决这个问题有什么想法吗?
我通过执行以下步骤找到了解决方案:
- 停止 WSO2IS 服务器
- 在文件中注释您的 customAttributeFinder(在我的例子中是 DatabaseAttributeFinder)的 class:
<WSO2IS_HOME>/repository/conf/identity/entitlement.properties
- 启动WSO2IS服务器
- 转到管理控制台并检查是否在 Entitlement 的扩展部分中没有加载 customAttributeFinder。
- 停止 WSO2IS 服务器
- 在步骤 2 的文件中取消注释您的 customAttributeFinder
- 启动 WSO2IS
- 神奇的是一切正常。
WSO2IS 中似乎有一个错误,每当我修改标准策略编辑器的任何内容时,XACML 引擎开始以非常奇怪的方式运行。
我看过几个 Whosebug 的答案,其中仅通过重新启动服务器即可解决所有问题。
如果您不想让 WSO2IS 开始慢慢发疯,请远离 XACML 策略编辑器。
如果你想要证明,请查看这个 Jira Issue(特别是在评论部分):https://wso2.org/jira/browse/IDENTITY-5447
在我的例子中,我的一个策略使用了一个名称空间错误的属性,所以基本上 XACML 引擎找不到该属性,然后我得到了这个错误。有趣的是,当我发出不需要由该策略(在命名空间中有拼写错误)但另一个策略评估的请求时,也会发生这种情况。
因此,如果有人遇到此问题,我建议您检查以下内容。
1. 所有策略中的属性名都是正确的。
2. 验证属性的命名空间,该属性实际上属于定义的命名空间。
我在 WSO2IS 中创建了以下策略:
<Policy xmlns="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17" PolicyId="check-blacklist-users-in-login" 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-equal">
<AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">login</AttributeValue>
<AttributeDesignator AttributeId="urn:custom:company:1.0:operation:login-id"
Category="urn:custom:company:1.0:attribute-category:operation"
DataType="http://www.w3.org/2001/XMLSchema#string"
MustBePresent="true"/>
</Match>
</AllOf>
</AnyOf>
</Target>
<Rule Effect="Permit" RuleId="permit-blacklisted-users-with-step-up">
<Target>
<AnyOf>
<AllOf>
<Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal">
<AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">vip</AttributeValue>
<AttributeDesignator AttributeId="urn:custom:company:1.0:user-group:vip-id"
Category="urn:custom:company:1.0:attribute-category:user-group"
DataType="http://www.w3.org/2001/XMLSchema#string"
MustBePresent="true"/>
</Match>
</AllOf>
</AnyOf>
</Target>
<Condition>
<Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-equal">
<Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-one-and-only">
<AttributeDesignator AttributeId="urn:custom:company:1.0:is-user-in-blacklist:is-user-in-blacklist-id"
Category="urn:custom:company:1.0:attribute-category:is-user-in-blacklist"
DataType="http://www.w3.org/2001/XMLSchema#string"
MustBePresent="true"/>
</Apply>
<AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">true</AttributeValue>
</Apply>
</Condition>
<ObligationExpressions>
<ObligationExpression FulfillOn="Permit" ObligationId="extra-email">
<AttributeAssignmentExpression AttributeId="extra-email">
<AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">send-email</AttributeValue>
</AttributeAssignmentExpression>
</ObligationExpression>
</ObligationExpressions>
</Rule>
</Policy>
但是当我发送以下 XACML 请求时:
<Request xmlns="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17" CombinedDecision="false" ReturnPolicyIdList="false">
<Attributes Category="urn:custom:company:1.0:attribute-category:operation">
<Attribute AttributeId="urn:custom:company:1.0:operation:login-id" IncludeInResult="false">
<AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">login</AttributeValue>
</Attribute>
</Attributes>
<Attributes Category="urn:custom:company:1.0:attribute-category:user-group">
<Attribute AttributeId="urn:custom:company:1.0:user-group:vip-id" IncludeInResult="false">
<AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">vip</AttributeValue>
</Attribute>
</Attributes>
<Attributes Category="urn:custom:company:1.0:attribute-category:is-user-in-blacklist">
<Attribute AttributeId="urn:custom:company:1.0:users:user-id" IncludeInResult="false">
<AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">userJon</AttributeValue>
</Attribute>
</Attributes>
</Request>
我总是收到有关 AttributeDesignator 的不确定错误:
<Response xmlns="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17">
<Result>
<Decision>Indeterminate</Decision>
<Status>
<StatusCode Value="urn:oasis:names:tc:xacml:1.0:status:processing-error"/>
<StatusMessage>Couldn't find AttributeDesignator attribute</StatusMessage>
</Status>
</Result>
</Response>
我使用以下代码创建了自定义 PIPAttributeFinder:
public class DatabaseAttributeFinder extends LoginDBAttributeFinder {
private DataSource dataSource;
private Set<String> supportedAttributes = new HashSet<String>();
private static Log log = LogFactory.getLog(DatabaseAttributeFinder.class);
private static final String BLACKLISTED_USER_ID = "urn:custom:company:1.0:is-user-in-blacklist:is-user-in-blacklist-id";
@Override
public void init(Properties properties) throws Exception {
String dataSourceName = (String) properties.get("DataSourceName");
if(dataSourceName == null || dataSourceName.trim().length() == 0){
throw new Exception("Data source name can not be null. Please configure it in the entitlement.properties file.");
}
dataSource = (DataSource) InitialContext.doLookup(dataSourceName);
supportedAttributes.add(BLACKLISTED_USER_ID);
}
... (other code)
而 class LoginDBAttributeFinder,看起来像这样:
public abstract class LoginDBAttributeFinder implements PIPAttributeFinder {
protected int tenantId;
private boolean isAbstractAttributeCachingEnabled = false;
private PIPAbstractAttributeCache abstractAttributeFinderCache = null;
private static Log log = LogFactory.getLog(LoginDBAttributeFinder.class);
public LoginDBAttributeFinder() {
}
public abstract Set<String> getAttributeValues(String blacklistUserId,
String attributeId,
String issuer) throws Exception;
@Override
public Set<String> getAttributeValues(URI attributeType, URI attributeId, URI category, String issuer, EvaluationCtx evaluationCtx) throws Exception {
String blacklistUserId = null;
Set attributeValues = null;
this.tenantId = CarbonContext.getThreadLocalCarbonContext().getTenantId();
EvaluationResult blacklistUser = evaluationCtx.getAttribute(new URI("http://www.w3.org/2001/XMLSchema#string"), new URI("urn:custom:company:1.0:users:user-id"), issuer, new URI("urn:custom:company:1.0:attribute-category:is-user-in-blacklist"));
attributeValues = this.getAttributeValues(blacklistUserId, attributeId.toString(), issuer);
return attributeValues;
... (other code)
我已经在 WSO2IS 中成功注册了 jar(它显示在管理控制台中)并且每当我进入 TryIt 选项并测试特定策略(检查黑名单用户登录)时它 returns 允许,但是当我转到 WSO2IS 控制台的侧边菜单 "Tools" 并使用通用 "TryIt" 工具时,它 returns 不确定(找不到 AttributeDesignator)。
它似乎找不到策略,因此找不到与该策略支持的属性相关的 AttributeDesignator。
我也尝试使用 REST API (https://WSO2ISIP:4443/api/identity/entitlement/decision/pdp),而且我得到:不确定(无法找到 AttributeDesignator)
关于如何解决这个问题有什么想法吗?
我通过执行以下步骤找到了解决方案:
- 停止 WSO2IS 服务器
- 在文件中注释您的 customAttributeFinder(在我的例子中是 DatabaseAttributeFinder)的 class:
<WSO2IS_HOME>/repository/conf/identity/entitlement.properties
- 启动WSO2IS服务器
- 转到管理控制台并检查是否在 Entitlement 的扩展部分中没有加载 customAttributeFinder。
- 停止 WSO2IS 服务器
- 在步骤 2 的文件中取消注释您的 customAttributeFinder
- 启动 WSO2IS
- 神奇的是一切正常。
WSO2IS 中似乎有一个错误,每当我修改标准策略编辑器的任何内容时,XACML 引擎开始以非常奇怪的方式运行。
我看过几个 Whosebug 的答案,其中仅通过重新启动服务器即可解决所有问题。
如果您不想让 WSO2IS 开始慢慢发疯,请远离 XACML 策略编辑器。
如果你想要证明,请查看这个 Jira Issue(特别是在评论部分):https://wso2.org/jira/browse/IDENTITY-5447
在我的例子中,我的一个策略使用了一个名称空间错误的属性,所以基本上 XACML 引擎找不到该属性,然后我得到了这个错误。有趣的是,当我发出不需要由该策略(在命名空间中有拼写错误)但另一个策略评估的请求时,也会发生这种情况。
因此,如果有人遇到此问题,我建议您检查以下内容。 1. 所有策略中的属性名都是正确的。 2. 验证属性的命名空间,该属性实际上属于定义的命名空间。