Hyperledger-Composer:条件类型为 (r.someArray.indexOf(p.getIdentifier()) > -1) 的 ACL 规则不起作用

Hyperledger-Composer: ACL-rules with condition of type (r.someArray.indexOf(p.getIdentifier()) > -1) not working

在我的 hyperledger-composer 应用程序中,访问控制规则具有以下类型的条件:

(r.someArray.indexOf(p.getIdentifier()) > -1)

不工作。

下面是此类 ACL 规则的示例:

rule SuperiorsHaveReadAccessToTheirTeamMembers {
    description: "Allow superiors read access to data on their team members"
    participant(p): "org.comp.app.Employee"
    operation: READ
    resource(r): "org.comp.app.Employee"
    condition: (r.superiors.indexOf(p.getIdentifier()) > -1)
    action: ALLOW
}

澄清:

participant Employee extends User {
  o String company optional
  --> Employee[] superiors optional
}

所以上面的访问控制规则简单地说明当且仅当员工 B 的数组属性 "superiors" 包含员工 A(即如果员工 A 是员工 B 的上级)时,员工 A 对员工 B 具有读访问权限).

然而,它不起作用。员工 A 没有员工 B 的读取权限。所有其他此类访问控制规则也不起作用。

这是 hyperledger-composer 中的错误吗?

不,这不是错误。这又是因为您正在使用一组资源对象,就像您对其建模一样。 indexOf 适用于字符串对象。它对我有用如下:

rule SuperiorsHaveReadAccessToTheirTeamMembers {
    description: "Allow superiors read access to data on their team members"
    participant(p): "org.comp.app.Employee"
    operation: READ
    resource(r): "org.comp.app.Employee"
    condition: (r.authorized &&    r.authorized.toString().indexOf(p.getIdentifier()) > -1)
    action: ALLOW

}

此外,请记住 indexOf 的工作原理:它会在第一场比赛中 'pass'。最好有一个 authorized 字段,并将缩短的(字符串)ID 存储在(比如)一个字段中,例如。 String[] authorized optional - 在这种情况下,您的原始规则将首次生效。