У участника нет доступа к ресурсу

Я создаю бизнес-модель с использованием составителя гиперссылки, в которой у меня есть банк в качестве участника и клиент в качестве актива. Определение банка приведено ниже:

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 к ресурсу. Проблема сохраняется, даже если я изменю операцию на CREATE в файле .acl. Я думаю, что проблема заключается в части состояния, но я не могу ее исправить.

У меня есть аналогичная транзакция для создания клиента, а именно:

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 не работает. Любая помощь приветствуется. Спасибо :)


person Nitin Kumar    schedule 26.06.2017    source источник


Ответы (2)


С помощью этого правила вы разрешаете банку обновлять транзакцию. Вам следует попробовать заменить ресурс updateCustomer на Customer, чтобы банк мог обновить актив:

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

Кроме того, вам, вероятно, следует добавить правило, дающее банку право создавать транзакцию updateCustomer:

rule bankCanCreateTransaction {
    description: "..."
    participant: "org.acme.sample.Bank"
    operation: CREATE
    resource: "org.acme.sample.updateCustomer"
    action: ALLOW
}
person ecn    schedule 26.06.2017
comment
То, что вы сказали, действительно имеет смысл, но транзакция createCustomer работает нормально (я только что обновил ее в вопросе). Если я изменю условие как condition: (true), оно обновит клиента. поэтому я думаю, что проблема в том, как я пишу условие. Могу ли я получить доступ к клиенту из транзакции updateCustomer, как я делаю в правиле? - person Nitin Kumar; 26.06.2017

Я выбрал другой путь и вместо того, чтобы проверять, принадлежит ли клиент этому банку в правилах, я проверил это в функции обработчика транзакций. Итак, мое правило для 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 (), а затем сопоставляет идентификатор банка с банком, в котором у клиента есть счет. Если они не совпадают, то in выдает ошибку

person Nitin Kumar    schedule 26.06.2017