我有一个关于访问控制的问题。
具体而言,问题是关于为参与者或资产定义的访问控制规则与为访问这些参与者/资产的交易定义的资产控制规则之间的关系。
下面是一个示例:
假设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"的访问控制规则的操作值设置为"拒绝">
rule EmployeeCanSubmitTransactionsToUpdateData {
description: "Allow employees to update their data"
participant: "org.company.biznet.Employee"
operation: CREATE
resource: "org.company.biznet.UpdateTransaction"
action: Denied
}
现在有以下情况:
每个员工(通过规则 1(都有权更改他/她的数据。 同时,不允许员工提交事务"UpdateTransaction"来更改数据(请参阅规则2(。
员工现在无法更改他们的数据吗?还是员工仍然可以在不提交事务"UpdateTransaction"的情况下更改其数据?
换句话说:参与者有没有办法在不使用 .cto 文件中定义的任何事务的情况下访问数据(他们有权访问数据(?
我认为答案是,这取决于。
在您的示例中,拒绝访问org.company.biznet.UpdateTransaction将导致org.company.biznet.Employee参与者无法使用该事务来更新其数据,即使他们本来是允许的。
话虽如此,您应该牢记系统事务,因为它们为org.company.biznet.Employee参与者更新自己的数据提供了另一种潜在途径。
例如,我在基本样本网络上尝试了一下,将EveryoneCanSubmitTransactions规则替换为
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 访问数据,则 ACL 不适用。
查看系统命名空间参考以及 ACL 参考,此外还有一个 ACL 教程,如果您还没有看过,可能会感兴趣。