如果为 participant/asset 定义的访问控制规则与事务的访问控制规则相矛盾怎么办?

What if access control rule defined for participant/asset contradicts access control rule for transaction?

我有一个关于访问控制的问题。

具体来说,问题是一方面为参与者或资产定义的访问控制规则与为访问这些 participants/assets 的交易定义的资产控制规则之间的关系。

这是一个例子:

假设使用 Hyperledger Fabric 网络为公司员工创建某种社交网络。

以下规则声明员工对其自己的数据具有写入权限:

rule EmployeesHaveWriteAccessToTheirOwnData {
    description: "Allow employees write access to their own data"
    participant(p): "org.company.biznet.Employee"
    operation: UPDATE
    resource(r): "org.company.biznet.Employee"
    condition: (p.getIdentifier() == r.getIdentifier())
    action: ALLOW
}

让我们假设写入访问是通过名为 "UpdateTransaction" 的事务促进的。进一步假设(可能是偶然的)事务"UpdateTransaction"的访问控制规则的动作值设置为"Denied"

rule EmployeeCanSubmitTransactionsToUpdateData {
    description: "Allow employees to update their data"
    participant: "org.company.biznet.Employee"
    operation: CREATE
    resource: "org.company.biznet.UpdateTransaction"
    action: Denied
}

现在有以下情况:

每位员工(通过规则 1)都有权更改 his/her 数据。 同时不允许员工提交交易"UpdateTransaction"更改数据(见规则2)。

员工现在是不是不能改数据了?或者员工是否仍然可以在不提交交易的情况下更改他们的数据"UpdateTransaction"?

换句话说:是否有一种方法可以让参与者在不使用 .cto 文件中定义的任何交易的情况下访问数据(他们拥有访问权限)?

我认为答案是,这取决于。

在您的示例中,拒绝访问 org.company.biznet.UpdateTransaction 交易将导致 org.company.biznet.Employee 参与者无法访问使用该交易来更新他们的数据,即使他们在其他情况下是被允许的。

话虽如此,您应该牢记系统交易,因为它们为 org.company.biznet.Employee 参与者提供了另一条更新自己数据的潜在途径。

例如,我通过将 EverybodyCanSubmitTransactions 规则替换为

basic-sample-network 上进行了尝试
rule NobodyCanSubmitTransactions {
    description: "Do not allow all participants to submit transactions"
    participant: "org.example.basic.SampleParticipant"
    operation: CREATE
    resource: "org.example.basic.SampleTransaction"
    action: DENY
}

该业务网络包含 OwnerHasFullAccessToTheirAssets 规则,我能够使用 org.hyperledger.composer.system.UpdateAsset 事务为参与者进行更新使用命令拥有资产的人,

composer transaction submit -d "$(cat txn.json)" -c party1@basic-sample-network

其中 txn.json 包含,

{
  "$class": "org.hyperledger.composer.system.UpdateAsset",
  "resources": [
    {
      "$class": "org.example.basic.SampleAsset",
      "assetId": "ASSET1",
      "owner": "resource:org.example.basic.SampleParticipant#PARTY1",
      "value": "5000"
    }
  ],
  "targetRegistry": "resource:org.hyperledger.composer.system.AssetRegistry#org.example.basic.SampleAsset"
} 

如果您在 ACL 规则中锁定了系统名称空间,那将无法工作。 (ACL 需要深思熟虑!)

关于 ACL 要记住的另一件重要事情是,如果您使用 getNativeAPI 方法通过事务处理器函数中的 Hyperledger Fabric API 访问数据,它们将不适用。

查看 system namespace reference along with the ACL reference, plus there is an ACL tutorial 如果您还没有看过它,您可能会感兴趣。