我正在为Hyperledger开发一些权限逻辑,当需要在permission.acl条件下需要使用3个资源的情况时。
简要介绍场景让我们假设资源事务处理需要给出读取权限,参与者是P谁需要读取事务t。
现在,Transaction t包含资产A的标识符名称。因此,我想制定一个条件,如果资产A中的标识符(名称)等于事务T名称,则将资产A注册商(这将保留参与者名称)与参与者P标识符进行比较。如果比较成功,则将资源(交易T)的读取权限授予参与者P.
例如片段。
Asset ABC identified by name{
o String name;
--> Company registrar; (Company is type of participant)
}
Transaction CreateABC{
o String name;
}
因此,如果包含createABC.name的Asset具有等于P.getIdenitifer()的registar,则类型公司的参与者P应具有读取事务CreateABC的权限;
我已经读过,我们可以在js文件中创建单独的函数,并从permission.acl调用它,但我还不能实现这种情况。
//首先,访问调用事务资源本身
rule Transaction_access {
description: "Can generate transaction"
participant: "org.acme.account.AccountTrader"
operation: CREATE
resource: "org.acme.account.TransferAmount"
action: ALLOW
}
// next,(示例)动态ACL规则,用于评估事务的执行者
rule BiTrade_betweenTraders_only {
description: "Only Allow Updatee between Transferor/Transferee via named transaction"
participant(p): "org.acme.account.AccountTrader"
operation: ALL
resource(v): "org.acme.account.BankAccount"
transaction(tx): "org.acme.account.TransferAmount"
condition: ( p.getIdentifier() === v.owner.getIdentifier() && v.getIdentifier() === tx.targetAccount.getIdentifier() )
action: ALLOW
}
更新第2项:
rule my_restricted_Transaction_access { description: "as per description above" participant(p): "org.acme.account.AccountTrader" operation: CREATE resource(v): "org.acme.account.TransferAmount" condition: ( p.getIdentifier() === v.account.owner.getIdentifier() ) action: ALLOW }
其中TransferAmount
可能被定义为:
transaction TransferAmount {
--> Account account // asset
}
和account
有一个--> owner
字段指向AccountTrader(参与者,在我的原始示例中等等) - 请记住,您的ACL必须允许参与者也可以访问相关的资产和资产所有者目标资源。
显然这是一个简单的例子 - 但你可以在condition
部分定义你的函数(对你的模型进行等效检查)。如果您已经在/lib
下将JS脚本添加到BNA(并在Fabric上升级了业务网络以使其生效) - 那么您只需要担心您的函数名称是否就是您所称的(再次,我发送给您的链接)应提供一个明确的使用示例)。
更新项目3:
例如在你的permissions.acl文件中有一条规则:
rule rule_func_condition {
description: "Allow all participants access to all resources"
participant(p): "org.acme.account.AccountTrader"
operation: CREATE
resource(a): "org.example.account.TransferAmount"
condition: (testOwnership(a, p))
action: ALLOW
}
在/lib
文件夹中的functions.js(或其他)中(如果您愿意,可以使用现有的logic.js,但是您想要这样做):
/**
* Test that the specified asset is owned by the specified participant.
* @param {Resource} asset The asset.
* @param {Resource} participant The participant.
* @return {boolean} True if yes, false if no.
*/
function testOwnership(asset, participant) {
return asset.owner.getIdentifier() === participant.getIdentifier();
}
其中asset
和participant
对象被传递到此特定函数示例中。