参与者没有资源

时间:2017-06-26 07:53:14

标签: access-control hyperledger hyperledger-composer

我正在使用hyperledger作曲家制作商业模式,其中我将银行作为参与者,将客户作为资产。银行的定义如下:

participant Bank identified by bankId {
o String bankId
o String name
o String code
}

客户看起来像这样:

asset Customer identified by aadhaarId {
o String aadhaarId
o String panId
o String firstName
o String lastName
o String contactNo
o String residence
o String accountNumber
o AccountType accountType
o String creationDate  
--> Bank bank
}

我希望参与者(银行)只能更新属于它的客户,并且我想创建一个事务来执行此操作。所以我创建了以下事务:

transaction updateCustomer identified by transactionId {
o String transactionId  
--> Customer customer
o Customer newDetails
}

并在.acl文件中定义了一条规则,如下所示:

rule bankCanUpdateItsCutomersViaTransaction {
description: "Allow a participant to update it's own resources"
participant(p): "org.acme.sample.Bank"
operation: UPDATE
resource(r): "org.acme.sample.updateCustomer"
condition: (p.getIdentifier() == r.customer.bank.getIdentifier())
action: ALLOW
}

为了测试这个,我创建了一个参与者(除了已经提供的管理员)并创建了一个与该参与者链接的客户。我有一个交易处理器功能,它只是更新客户资产注册表。 但是当我尝试执行updateCustomer事务时,我收到一条错误消息,指出参与者没有对资源的CREATE访问权限。即使我在.acl文件中将操作更改为CREATE,问题仍然存在。我认为问题在于条件部分,但我无法纠正它。

我有一个类似的事务来创建Customer,如下所示:

transaction createCustomer identified by transactionId {
o String transactionId
o Customer newCustomer 
}

,其规则如下:

rule bankCanCreateItsCutomersViaTransaction {    
description: "Allow a participant to create it's own resources"
participant(p): "org.acme.sample.Bank"
operation: CREATE
resource(r): "org.acme.sample.createCustomer"
condition: (p.getIdentifier() == r.newCustomer.bank.getIdentifier())
action: ALLOW
}

此createCustomer事务后面有一个简单的事务处理器函数,它只是在客户资产注册表中添加newCustomer。这工作完全正常但updateCustomer事务不起作用。 任何帮助将非常感激。谢谢:))

2 个答案:

答案 0 :(得分:1)

根据此规则,您允许银行更新交易。您应该尝试按客户替换ressource updateCustomer,以便银行可以更新资产:

resource(r): "org.acme.sample.Customer"

此外,您应该添加一条规则,授权银行创建 updateCustomer 交易:

rule bankCanCreateTransaction {
    description: "..."
    participant: "org.acme.sample.Bank"
    operation: CREATE
    resource: "org.acme.sample.updateCustomer"
    action: ALLOW
}

答案 1 :(得分:0)

我采取了一些其他路径,而不是在规则中检查客户是否属于该银行,我在交易处理器功能中检查了该路径。所以我对updateCustomer的规则如下所示:

rule bankCanInvokeUpdateCustomer {
description: "Allow a bank to invoke updateCustomer transaction"
participant: "org.acme.sample.Bank"
operation: CREATE
resource: "org.acme.sample.updateCustomer"
action: ALLOW 
}

我按照以下方式检查了银行:

var currentParticipant = getCurrentParticipant();
var currentBank = currentParticipant["$identifier"];
var actualBank = tx.customer.bank.bankId;
if( actualBank != currentBank) 
   throw new Error('You can not update someone else\'s customer');

上面的代码通过使用getCurrentParticipant()函数获取当前参与者,然后将银行标识符与客户帐户所在的银行匹配。如果它们不相同,则会抛出错误