#3391 的独立 follow-up ④。
背景
P1 让 export 的列投影与 list 的字段级权限(FLS)对齐,方案是「从 masked 行推导」:取首块 masked 行的键并集 ∩ schema 字段,作为导出表头(packages/rest/src/rest-server.ts export 路由,#3498)。这是当时半径可控的方案,但有已知妥协:
- 首块行里某可读字段若恰好全为 null(且驱动省略 null 键),该列表头会消失(纯外观问题)。
- 空结果集退回全 schema 表头。
长期正解
给 security 服务加一个 getReadableFields(object, context) 查询面,直接返回该 context 下的可读字段集,export 用它做列投影,而不是从数据行反推。
为什么当时没做
REST 层只有 protocol 句柄,够不到 kernel 的 security 服务;加这个查询面 P1 半径过大。需要:
关联:#3391、#3498(现「从 masked 行推导」实现 + 阻塞性列投影测试)。
#3391 的独立 follow-up ④。
背景
P1 让 export 的列投影与 list 的字段级权限(FLS)对齐,方案是「从 masked 行推导」:取首块 masked 行的键并集 ∩ schema 字段,作为导出表头(
packages/rest/src/rest-server.tsexport 路由,#3498)。这是当时半径可控的方案,但有已知妥协:长期正解
给 security 服务加一个
getReadableFields(object, context)查询面,直接返回该 context 下的可读字段集,export 用它做列投影,而不是从数据行反推。为什么当时没做
REST 层只有 protocol 句柄,够不到 kernel 的 security 服务;加这个查询面 P1 半径过大。需要:
getReadableFields(object, context)(复用 FieldMasker 的可读判定,与读中间件同源,杜绝漂移)。关联:#3391、#3498(现「从 masked 行推导」实现 + 阻塞性列投影测试)。