Hyperledger Composer权限配置:参与者仅查看自身提交的交易
Hyperledger Composer:让参与者仅查看自身提交交易的正确权限配置
看起来你在权限规则的条件判断上踩了个小坑——想要实现Portfolio参与者只能查看自己关联的TradeInstrument交易,但当前配置下参与者请求返回空数组,管理员却能正常获取数据。核心问题出在ParticipantCanSeeOwnTransactions规则的逻辑错误上,下面一步步帮你修正:
问题根源分析
你当前的ACL规则里,condition: (v.participantInvoking.getIdentifier() == t.getIdentifier())是错误的:
v代表的是TradeInstrument交易资源,你的模型里交易并没有participantInvoking字段,交易里关联的参与者字段是participant(对应model.cto里的定义)t是当前发起请求的Portfolio参与者,你需要对比的是交易中关联的participant和当前参与者的ID是否一致,而不是错误的字段
另外,operation: ALL权限给得太宽了,既然需求只是查看交易,应该限制为READ,遵循最小权限原则。
修正后的完整permissions.acl
替换你原有的ParticipantCanSeeOwnTransactions规则,其他保留的规则没问题:
rule ParticipantCanSeeOwnTransactions { description: "Allow Portfolio participants to view only their own TradeInstrument transactions" participant(t): "org.example.cashbalance.Portfolio" operation: READ resource(v): "org.example.cashbalance.TradeInstrument" condition: (v.participant.getIdentifier() == t.getIdentifier()) action: ALLOW } rule NetworkAdminUser { description: "Grant business network administrators full access to user resources" participant: "org.hyperledger.composer.system.NetworkAdmin" operation: ALL resource: "**" action: ALLOW } rule NetworkAdminSystem { description: "Grant business network administrators full access to system resources" participant: "org.hyperledger.composer.system.NetworkAdmin" operation: ALL resource: "org.hyperledger.composer.system.**" action: ALLOW } rule SystemACL { description: "System ACL to permit all access" participant: "ANY" operation: ALL resource: "org.hyperledger.composer.system.**" action: ALLOW }
关键修正点详解
条件逻辑修正:
v.participant.getIdentifier():获取当前交易关联的Portfolio参与者IDt.getIdentifier():获取当前发起请求的Portfolio参与者ID- 两者对比后,只有交易属于当前参与者时,才允许读取
权限范围收紧:
- 把
operation: ALL改成operation: READ,只给参与者读取自身交易的权限,避免赋予修改、删除等不必要的权限
- 把
部署与验证注意事项:
- 提交
TradeInstrument交易时,务必确保交易的participant字段正确关联到发起交易的Portfolio实例(否则规则无法匹配) - 更新ACL后,需要重新部署业务网络,并且重启Composer REST服务器,确保新的权限规则生效
- 提交
测试方法
- 用管理员身份提交几条关联不同Portfolio的
TradeInstrument交易 - 切换到某个Portfolio参与者的身份,调用
GET /TradeInstrument接口 - 验证返回结果只包含该参与者关联的交易,其他交易不会被返回
内容的提问来源于stack exchange,提问作者Shaikat Haque
相关产品推荐
相关产品推荐

