NocoBase 2.2.4:普通用户创建必填 belongsTo 关联记录失败,如何安全配置?

环境信息

  • NocoBase 版本:2.2.4
  • 数据库:PostgreSQL 16
  • 使用场景:采购报价管理
  • 数据表:crm_product_prices
  • 普通采购角色:PROCUREMENT

一、业务需求

普通采购员需要通过 NocoBase 原生 Create 表单创建采购报价,同时关联已有的 SKU 和 Supplier。

相关字段:

  • sku :belongsTo 关联,外键 sku_id
  • supplier :belongsTo 关联,外键 supplier_id

普通采购员只能使用自己有权引用的关联记录,不能通过 API 伪造未经授权的外键。

二、目前遇到的问题

  1. Create 表单已配置 SKU 和 Supplier 关联选择字段。
  2. 采购员 Create 权限白名单包含逻辑关联字段 sku 、supplier 。
  3. 白名单未开放物理外键 sku_id 、supplier_id 。
  4. 实际创建时,最终 INSERT 缺少 sku_id 、supplier_id 。
  5. 因为 sku_id 存在 NOT NULL 约束,创建失败。

未成功保存该笔报价。

三、已查看的源码行为

在 NocoBase 2.2.4 中,Repository.create() 会先执行 UpdateGuard.sanitize() ,然后执行 model.create() ,最后执行 updateAssociations() 。

我们怀疑逻辑关联与物理外键的转换、白名单过滤及后续关联更新之间存在兼容问题,但尚未最终确认根因。

四、希望官方帮助确认

问题1: NocoBase 2.2.4 是否有官方推荐的原生配置方法,允许普通用户创建包含必填 belongsTo 关联的记录?

问题2: Create 白名单应当配置逻辑关联字段 sku 、supplier ,还是需要配置对应物理外键?

问题3: 如果必须允许写入物理外键,NocoBase 如何在服务端验证该用户是否有权引用指定的 SKU/Supplier,防止伪造关联?

问题4: 如果原生 ACL 配置无法实现,官方推荐使用哪一种服务端扩展方式?是否有可参考的插件或案例?

问题5: 此问题是否属于 2.2.4 已知问题?是否有对应修复版本?

五、希望达到的效果

普通采购员使用原生表单选择合法 SKU 和 Supplier,保存采购报价成功,同时满足:

  • 不允许越权关联其他记录。
  • 创建人由系统可信赋值。
  • 不扩大普通采购员的数据修改权限。
  • 不改变现有审批工作流。
  • 优先采用原生配置或官方支持的最小修复方式。

希望获得适用于 NocoBase 2.2.4 的官方配置建议或代码参考。谢谢!

您好 @support,想请 NocoBase 技术团队帮忙看一下这个问题。

我们使用 NocoBase 2.2.4,目前 Root 管理员可以正常创建带 belongsTo 关联的报价记录,但普通角色和采购主管创建时出现 sku_id=NULL,导致保存失败。

这个问题已经阻断采购员录入和主管审批的正式业务流程。

此前我们排查了字段白名单,但不希望通过开放物理外键权限来绕过安全控制。

想请教官方是否有推荐的原生权限配置、已知修复版本或安全解决方案?

感谢帮助!

请在demo环境中复现下这个问题
Loading... (账户admin@nocobase.com 密码admin123)

您好 @hongboji,感谢回复。

我已经登录官方 Demo,并确认当前 Demo 版本为 2.4.0-alpha.13.20261025160207 ,而我们出现故障的正式环境是 NocoBase 2.2.4 。

目前我们已经验证:相同的 belongsTo 关联数据在 Root 下创建成功,但普通采购角色、采购主管角色提交时报 sku_id=NULL 。

请问:

  1. 这个问题是否已经在较新的 2.2 稳定补丁版本(例如 2.2.33)中修复?
  2. Demo 使用 2.4 Alpha,是否适合复现 2.2.4 的角色字段白名单问题?
  3. 如果需要复现,是否有与 2.2.4 对应的演示环境或推荐的最小配置方法?

我们可以配合最小复现,但希望先确认版本差异,以避免无效测试。

谢谢!

两个版本没有区别,请复现后提供地址和角色

您好 @hongboji,按照您的建议,我已经在官方 Demo 中进行了最小复现测试。

测试环境:

  • Demo:NocoBase 2.4.0 Alpha
  • 测试 Collection:price02_fk_repro_20261026
  • 测试角色:price02_fk_repro_20261026
  • 测试用户:price02_fk_user_20261026
  • 复现页面地址:(Loading...)

测试配置:

  • sku :Many-to-One / belongsTo → products.id
  • 物理外键:sku_id
  • 普通角色允许 Create,字段白名单仅允许逻辑关联 sku ,不允许写入 sku_id
  • Products 只开放必要字段的 View 权限

实际结果:
普通角色选择 Atlas Power Cabinet 并提交,创建成功。管理员查看新记录时,sku_id=362264840306688 ,关联正常保存。

因此,当前简化 Demo 案例未能复现正式环境中的 sku_id=NULL 故障。

正式环境使用 NocoBase 2.2.4,采购报价还包含 Supplier belongsTo 关联、更多报价字段及数据库 NOT NULL / 组合外键约束。

想请您指导:下一步应该优先补充哪个关键条件,才能准确复现正式环境的问题?

我们可以继续配合最小复现,不希望直接开放客户端对物理外键的写入权限。

感谢!

您好 @hongboji,

感谢您此前的指导。

按照您的要求,我们已经在官方 Demo 中完成了测试 Collection、角色、用户及 Create 表单的搭建,并已在第 6 楼提供详细配置和测试结果。

现有 Demo 页面:

https://al6vo1wjap21.v12.demo.nocobase.com/admin/gcksqx1rou1

  • Collection:price02_fk_repro_20261026
  • 角色:price02_fk_repro_20261026
  • 用户:price02_fk_user_20261026

目前的关键差异:

  1. 官方 Demo(2.4 Alpha):普通角色仅授权逻辑关联字段 sku ,创建成功,sku_id 正常写入。
  2. 正式环境(2.2.4):管理员可创建报价,但普通采购员及采购主管创建失败,出现 sku_id=NULL 。
  3. 正式环境还包含 Supplier belongsTo 关联、更多报价字段,以及数据库 NOT NULL、组合外键等约束。

希望您能协助直接检查我们已经建立的 Demo 配置,并指导下一步定位。

我们主要想确认:

  1. 目前 Demo 的关联字段和角色权限配置是否正确?
  2. 生产环境的问题是否可能与双 belongsTo 关联、字段白名单、数据库约束或 Create 执行顺序有关?
  3. 如果需要进一步定位,我们应该提供哪些最关键的脱敏证据(例如请求 Payload、角色 ACL 配置、服务端错误日志)?
  4. 是否有适用于 2.2.4 的原生配置方案或安全修复建议?

目前正式 CRM 已完成部分建设,但普通采购员创建采购报价仍受阻,影响后续正常业务流程。

我们希望尽可能复用现有 Demo,由您协助检查具体差异,而不是重新进行一轮不确定的复现测试。

如需进一步查看正式环境的配置或日志,我们可以按照您指定的范围提供脱敏信息。

感谢您的帮助!