我对访问控制有疑问。
具体而言,问题是关于为参与者或资产定义的访问控制规则与为访问这些参与者/资产的交易定义的资产控制规则之间的关系。
以下是一个例子:
假设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文件中定义的任何事务的情况下访问数据(他们有访问权限)?
答案 0 :(得分:1)
我认为答案是,这取决于。
在您的示例中,拒绝访问 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以及ACL reference,如果您还没有看到它,可能会感兴趣ACL tutorial。