PII示例网络添加Doctor参与者后授权事务无法识别该角色的问题
嘿,我之前在类似的PII网络场景里碰到过一模一样的问题,咱们一步步来拆解问题、解决它:
问题核心原因
你的事务逻辑和模型定义还没跟上新增的Doctor参与者,导致系统依然只在Member集合里查找被授权人,完全没去Doctor注册表中匹配。
1. 先修正CTO模型的事务定义
原来的授权事务里,被授权人(grantee)的类型大概率被限定为Member,得把它改成兼容Doctor的类型:
- 旧的事务定义可能是这样:
transaction GrantAccess { --> Member grantor --> Member grantee String permissionLevel } - 如果你给
Member和Doctor定义了一个父类(比如Person),直接把grantee类型改成父类即可:transaction GrantAccess { --> Member grantor --> Person grantee String permissionLevel } - 要是没定义父类,也可以用联合类型明确允许两种参与者:
transaction GrantAccess { --> Member grantor --> (Member or Doctor) grantee String permissionLevel }
2. 更新事务处理器的查找逻辑
这是最关键的一步!原来的代码肯定只在Member注册表中查询,现在要改成能同时匹配Doctor:
- 旧的处理器代码大概是这样:
async function grantAccess(tx) { // 只查Member注册表 const memberRegistry = await getParticipantRegistry('org.example.Member'); const grantee = await memberRegistry.get(tx.grantee.$identifier); // 后续授权逻辑... } - 改成先查
Doctor注册表,没找到再查Member:async function grantAccess(tx) { let grantee; try { // 优先查找Doctor const doctorRegistry = await getParticipantRegistry('org.example.Doctor'); grantee = await doctorRegistry.get(tx.grantee.$identifier); } catch (err) { // 没找到则 fallback 到Member const memberRegistry = await getParticipantRegistry('org.example.Member'); grantee = await memberRegistry.get(tx.grantee.$identifier); } // 执行授权逻辑,比如更新权限关联记录 // ... } - 要是用了父类
Person,更简单,直接查询父类注册表:async function grantAccess(tx) { const personRegistry = await getParticipantRegistry('org.example.Person'); const grantee = await personRegistry.get(tx.grantee.$identifier); // 后续逻辑... }
3. 重新部署网络,确保变更生效
改完代码和模型后,必须重新打包、部署网络才能让修改生效:
- 打包成BNA文件:
composer archive create -t dir -n . - 安装更新包:
composer network install --card admin@your-pii-network --archiveFile your-network.bna - 升级网络版本:
composer network upgrade --card admin@your-pii-network --networkName your-network --networkVersion x.x.x - 另外要确认
Doctor参与者已经通过composer participant add命令或API正确注册到网络中。
4. 验证客户端调用参数
最后检查一下:调用授权事务时传入的grantee确实是Doctor的ID,别不小心传成Member的ID——这种低级错误有时候也会造成“找不到Doctor”的假象。
这样调整之后,Member就能正常给Doctor授权/撤销权限啦!
内容的提问来源于stack exchange,提问作者Vipoon
相关产品推荐
相关产品推荐

