如果为 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 如果您还没有看过它,您可能会感兴趣。
我有一个关于访问控制的问题。
具体来说,问题是一方面为参与者或资产定义的访问控制规则与为访问这些 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 如果您还没有看过它,您可能会感兴趣。