Правило управления доступом Hyperledger Composer с условием, зависящим от другого ресурса - PullRequest
0 голосов
/ 15 января 2019

У меня проблема с определением правила контроля доступа в hyperledger composer. Допустим, у меня есть ресурс (актив) asset1 и asset2 и участник p1 в пространстве имен org.example. Пример файла модели (.cto):

namespace org.example

participant p1 identified by p1Id 
    {
    o String p1Id
    o String name
    }

asset asset1 identified by asset1Id
    {
    o String asset1Id
    o String name
    }

asset asset2 identified by asset2Id
    {
    o String asset2Id
    o String name
    --> p1
    --> asset1 asset1
    }

Как видите, asset2 ссылки p1 и asset1. Тем не менее, в моей модели есть соотношение 1: 1 между asset1 и asset2. Но я не хочу ссылаться на второй актив в определении модели первого актива (--> asset2 asset2), потому что к моменту создания экземпляра asset1 (выполнение "$class":"org.hyperledger.composer.system.AddAsset") экземпляр asset2 может уже не существовать.

Моя цель - предоставить экземпляр p1 READ доступа к asset1 , только если этот экземпляр объявлен в asset2 с соответствующим asset1.

Для решения я думал сделать ссылку в asset1 (--> asset2 asset2 optional) необязательной и избежать встроенной функции создания ресурса ("org.hyperledger.composer.system.AddAsset"). Таким образом, реализуем пользовательскую транзакцию (AddAssetAsset2) в файле logic.js, которая обновляет необязательную ссылку asset2 в соответствующем экземпляре asset1. Но я хочу использовать встроенную функцию, которую можно легко вызвать в composer-playground.

Итак, я сейчас спрашиваю, существует ли какое-либо решение объявить этот специальный READ доступ для p1 экземпляра в файле .acl? Эта ситуация немного отличается от этого вопроса переполнения стека .

В частности, возможно ли использовать другие ресурсы в условии правила? Как например:

rule P1ReadAsset1Rule {
    description: "P1 can read the asset1 if p1 is defined in the asset2"
    participant(p): "org.example.p1"
    operation: READ
    resource(r): "org.example.asset1"
    condition: (org.example.asset2.p1.getIdentifier() == p.getIdentifier() && org.example.asset2.asset1.getIdentifier() == r.getIdentifier())
    action: ALLOW
}

Может ли быть такое решение или я должен сделать это по-другому? Например. использование служебной функции javascript с запросом, объявленным в .qry?

Спасибо, ребята, что помогли мне:)

...