目前,我在同一个业务网络(org1和org2)上有两个组织,我在模型文件中设置的参与者具有不同的角色
participant Mailer identified by workerid {
o String workerid
}
participant Processor identified by wid {
o String wid
}
有没有办法在权限文件中添加规则,以便只有org1的管理员可以创建Mailers,而只有org2的管理员才能创建处理器。
的内容rule enableOrg1ToCreateMailers {
description: "Enable admin from org 1 to create Mailers"
participant(t): "org.hyperledger.composer.system.NetworkAdmin"
operation: CREATE
resource: "demonetwork1.Mailer"
condition: (t.organization.getidentifier() == "org1")
action: ALLOW
}
答案 0 :(得分:0)
如果你看一下ACL语言的文档,你会发现这篇文章描述了condition
:
Condition是绑定变量上的布尔JavaScript表达式。这里可以使用
if(...)
表达式中合法的任何JavaScript表达式。用于ACL规则条件的JavaScript表达式可以引用脚本文件中的JavaScript实用程序函数。这允许用户轻松实现复杂的访问控制逻辑,并在多个ACL规则中重用相同的访问控制逻辑功能。
所以在我看来,正确的方法是尝试使用此功能,并了解如何将基于javascript的逻辑注入ACL文件。
答案 1 :(得分:0)
你的规则可能更像是这样(因为'组织'不是'系统'管理类的属性):
rule enableOrg1ToCreateMailers {
description: "Enable admin from org 1 to create Mailers"
participant(t): "org.hyperledger.composer.system.NetworkAdmin"
operation: ALL // (CREATE, READ, UPDATE, DELETE)
resource: "demonetwork1.Mailer"
condition: (t.getIdentifier() == "org1admin")
action: ALLOW
}
您可能更喜欢将参与者实例定义为org.acme.mynetwork.orgadmin
(在模型中添加“组织”字段),然后使用它。例如。
participant(t): "org.acme.mynetwork.orgadmin"
以及您上面的原始状况。
提供组织(就像您已经完成的)作为创建业务网络资源所涉及的业务网络参与者类的属性更有效,因此立即检查ACL ...而不是从其他源派生它是。我只添加了'ALL' - 如果允许相同的业务网络管理员在这些资源上执行其他CRUD操作(例如,超过'CREATE'操作等)。
最后,一个例子(虽然稍微复杂的条件,但仍然可以给你相同的原则)在这里显示为一个有用的参考点:Includes function in ACL condition