Hyperledger事务基于某些第三资源的参与者权限

问题描述 投票:0回答:1

我正在为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调用它,但我还不能实现这种情况。

hyperledger-fabric hyperledger hyperledger-composer
1个回答
1
投票
  1. 使用3个资源的例子就像(例子):

//首先,访问调用事务资源本身

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项:

  1. 基于参与者的资产所有权(均来自事务对象)提供对事务资源的访问权限的示例可能是:
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上升级了业务网络以使其生效) - 那么您只需要担心您的函数名称是否就是您所称的(再次,我发送给您的链接)应提供一个明确的使用示例)。

  1. 调用函数作为ACL条件的一部分很简单 - 你可以在这个github测试文件中看到一个这样的例子 - >函数(JS)在这里https://github.com/hyperledger/composer/blob/master/packages/composer-tests-functional/systest/data/accesscontrols.js#L23和相应的(调用)ACL规则集在这里 - > https://github.com/hyperledger/composer/blob/master/packages/composer-tests-functional/systest/data/accesscontrols.acl#L124

更新项目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();
}

其中assetparticipant对象被传递到此特定函数示例中。

© www.soinside.com 2019 - 2024. All rights reserved.