Skip to content

删除记录时「引用清理」用操作人身份查询引用表,读权不足即整体 403(应以系统身份执行) #12166

Description

@baozhoutao

一句话

删除一条记录时,平台的「删除前引用清理」用当前操作人的身份去 find 每一张引用表;操作人只要对任何一张引用表没有读权限,整个删除就 403 —— 与记录是否真的被引用无关(空库也 403)。期望这一步用系统身份执行。

版本

@objectstack/*@17.2.0(driver-sql / objectql)

最小复现

  1. 对象 A 被对象 B 的一个 lookup 字段引用;
  2. 角色 R 对 A 有完整删除权限(含 modifyAllRecords),对 B 无读权限(access: private,未授 read);
  3. 用角色 R 的账号删除一条 A 记录(B 表可以是空表,零引用);
  4. 实际:DELETE /api/v1/data/<A>/<id> → 403 PERMISSION_DENIED;前端提示「您没有执行此操作的权限」。
  5. 对照:仅给 R 补上 B 的只读权限(删除权分毫未动),同一操作立即 200。

服务端日志(删除时刻)

ERROR Delete operation failed
  object: os_tianshun_ehr_product
  developerMessage: [Security] Access denied: operation 'find' on object
                    'os_tianshun_ehr_andon_record' is not permitted

为什么这是问题

  • 引用清理/引用检查是平台内部的数据一致性动作,不是操作人发起的查询;要求操作人对所有引用表有读权,等于「删除权 = 删除权 + 全部引用表读权」,而这层耦合在权限配置界面上完全不可见;
  • 实际项目里按「谁的台账给谁看」收紧读权后,我们盘出 17 组「角色×对象」是界面上有删除按钮、一按必 403 的状态;
  • 报错文案只有一句通用「没有权限」,不指明是哪张引用表的读权被拒,用户与管理员均无法自查(顺带的文案诉求)。

期望行为

删除前的引用清理查询以系统身份(isSystem context)执行;操作人的权限只应决定「能不能删这条 A」,不应外溢到引用表的可读性。

出处

应用项目实测记录(含 12 张 UI 截图、A/B 根因验证):steedos-labs/os-project-titanwind-ehr#1809

Metadata

Metadata

Assignees

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions