feat(matchmaker,referral): ZC-MM-005 统一数据范围与字段隐私(DEC-MATCHMAKER-005/§5.2 落地)
依据《善缘丹阳 V1.1 红娘角色权限正式决策与开发规则》DEC-MATCHMAKER-005 最小必要原则 与 §5.2 字段级隐私,ZC-MM-005 范围=「读接口行级数据范围统一接入判定器 + 字段白名单 + 组长团队脱敏统计」。承接 ZC-MM-002 落地的 matchmaker_assignments 事实源与 ServiceAssignmentPolicy 判定器。 E1 双轨切纯判定器(不留回退): - assertServiceAccess 纯化(删 assigned_operator_id 回退分支),判定器成唯一事实源 - getServiceDetail 删 viewerIsOwner 双态与「非负责人脱敏详情」整段 E2 非负责人防探测 404: - ServiceAssignmentPolicy.assertActiveAssignmentOrNotFound:无生效分配→先落 DATA_SCOPE_DENIED 审计再抛 NOT_FOUND(响应 404),存在性不可枚举, 与「查无此单」响应体逐字段一致(MM-PRIVACY-001) E3 字段白名单显式化 + 用户隐私开关: - 抽取 assembleMatchmakerUserProfile:仅 7 键(displayName/gender/age 派生/regionName/ educationCode/occupationCode/maritalStatus),无 birthDate 原值/详细地址/手机号/微信/ 身份证;接 UserPrivacySettings.showOccupation(缺省全放行) E4 死端点清理: - 删除 GET /operator/matchmaker/my-services(operatorId 误当 user_id、恒空、前后端零调用), 替代路径 /operator/matchmaker/assignments/my;C 端 /matchmaker/services 与 counseling myServices 保留 P1 残留收口(读/写路径仍信任废弃 assigned_operator_id 残留列,与 E1 同类洞): - P1-1 运营端推荐列表:MatchmakerRecommendationMapper.findByOperatorId 改 join 生效分配(active+expires),撤/结后不再可见 - P1-2 dashboard 三计数:count*ByOperator 改 join 生效分配 + COUNT(DISTINCT) 防重, end/revoke 后不再计入(DEC-002 规则7) - P1-3 转介授权:ReferralService.assertMatchmakerServesUser 切 serviceAssignmentPolicy.assertActiveAssignment(DATA_SCOPE_DENIED 审计 + 403), 删残留列查询 findActiveByOperatorAndUser 新端点(组长团队脱敏统计): - GET /operator/matchmaker/team/statistics(@PreAuthorize matchmaker.team.assign): 本组织 active 分配数/按红娘分组/在岗红娘数,纯计数无用户 PII;org 边界 IS NOT DISTINCT FROM(NULL=NULL 平台直属) P2-4 operatorName 脱敏决策:保留不脱敏(§5.2 字段分类:红娘姓名=团队范围内 工作人员标识非用户 PII;组长统计本团队工作量属管理职责),依据登记 docs/governance/open-questions.md OQ-MATCHMAKER-002(RESOLVED) 死代码清理:getOperatorServices(零调用)+ MatchmakerServiceMapper.findByOperatorId (残留列查询,调用清零)删除;C 端 MatchmakerService 遗留信任残留列按豁免未动(006/007 退役) 测试: - MatchmakerDataScope005Test(13 用例):MM-PRIVACY-001/002、MM-AUTH-001/003 读侧、 MM-LIFECYCLE-001 读侧、P1-1/2/3 残留收口负向(撤/结后推荐不可见/计数归零/转介 403)、 防探测逐字段一致、showOccupation 三态 - MatchmakerFieldPrivacyGuardTest(3 用例):字段白名单源码扫描 + 无导出端点锁定 - MatchmakerReferralPhase13Test 转介口径收紧(IllegalStateException→AccessDeniedException) - 负向注入自证(P1-3 残留列变异→判红→恢复复绿) 验证:定向 73/73;全量 851/851(3 预存 skip);UI 契约 24/24。
This commit is contained in:
@@ -64,6 +64,20 @@
|
||||
- **当前实现**:`match.effective` 为 `PROVISIONAL` 保守近似(`min(有真人消息会话, Match 总数)`),
|
||||
文档已标「禁止对外」。建议口径(Mutual Match + Two-Way Chat)未实现;升 `OFFICIAL` 前需产品裁决。
|
||||
|
||||
## OQ-MATCHMAKER-002 · 组长团队统计 perMatchmakerCounts 的 operatorName 是否脱敏?
|
||||
|
||||
- **状态**:RESOLVED(ZC-MM-005 收口 P2-4,team-lead 裁定 2026-10-10)
|
||||
- **裁定**:红娘姓名(operatorName)**保留、不脱敏**。依据:
|
||||
1. 对照《决策》§5.2 字段分类:红娘姓名属「本人/团队范围内的工作人员标识」,**非用户 PII**
|
||||
(§5.2 禁放的是 phone/mobile/wechat/idNumber 等用户敏感数据);
|
||||
2. 功能权限矩阵「查看脱敏服务统计:组长=团队范围」+ DEC-MATCHMAKER-002 红娘组长职责
|
||||
(团队内进度与工作量管理)—— 组长统计本团队工作量属管理职责;
|
||||
3. 组长已可经 `GET /assignable-matchmakers` 拿到同批红娘姓名,此字段**非新增泄露面**
|
||||
(管理范围 ≠ 用户敏感数据)。
|
||||
- **代码落点**:`MatchmakerAssignmentService#teamStatistics` 方法注释已写明该决策依据;
|
||||
本登记防止后人误判「统计含姓名=越权」。产品如日后要求组长统计姓名脱敏(如仅显示昵称/工号),
|
||||
需回到本项重新裁决并同步改 `countActiveGroupByOperator` 查询与前端渲染。
|
||||
|
||||
## OQ-THIRD-PARTY-* · 第三方开放 / 平台化遗留(7 项)
|
||||
|
||||
- **状态**:TBD(范围扩张,需产品决策,本轮未擅自实施)
|
||||
|
||||
Reference in New Issue
Block a user