环境信息
- NocoBase 版本:2.2.4
- 数据库:PostgreSQL 16
- 使用场景:采购报价管理
- 数据表:
crm_product_prices
- 普通采购角色:
PROCUREMENT
一、业务需求
普通采购员需要通过 NocoBase 原生 Create 表单创建采购报价,同时关联已有的 SKU 和 Supplier。
相关字段:
sku :belongsTo 关联,外键 sku_id
supplier :belongsTo 关联,外键 supplier_id
普通采购员只能使用自己有权引用的关联记录,不能通过 API 伪造未经授权的外键。
二、目前遇到的问题
- Create 表单已配置 SKU 和 Supplier 关联选择字段。
- 采购员 Create 权限白名单包含逻辑关联字段
sku 、supplier 。
- 白名单未开放物理外键
sku_id 、supplier_id 。
- 实际创建时,最终 INSERT 缺少
sku_id 、supplier_id 。
- 因为
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 。
请问:
- 这个问题是否已经在较新的 2.2 稳定补丁版本(例如 2.2.33)中修复?
- Demo 使用 2.4 Alpha,是否适合复现 2.2.4 的角色字段白名单问题?
- 如果需要复现,是否有与 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
目前的关键差异:
- 官方 Demo(2.4 Alpha):普通角色仅授权逻辑关联字段
sku ,创建成功,sku_id 正常写入。
- 正式环境(2.2.4):管理员可创建报价,但普通采购员及采购主管创建失败,出现
sku_id=NULL 。
- 正式环境还包含 Supplier belongsTo 关联、更多报价字段,以及数据库 NOT NULL、组合外键等约束。
希望您能协助直接检查我们已经建立的 Demo 配置,并指导下一步定位。
我们主要想确认:
- 目前 Demo 的关联字段和角色权限配置是否正确?
- 生产环境的问题是否可能与双 belongsTo 关联、字段白名单、数据库约束或 Create 执行顺序有关?
- 如果需要进一步定位,我们应该提供哪些最关键的脱敏证据(例如请求 Payload、角色 ACL 配置、服务端错误日志)?
- 是否有适用于 2.2.4 的原生配置方案或安全修复建议?
目前正式 CRM 已完成部分建设,但普通采购员创建采购报价仍受阻,影响后续正常业务流程。
我们希望尽可能复用现有 Demo,由您协助检查具体差异,而不是重新进行一轮不确定的复现测试。
如需进一步查看正式环境的配置或日志,我们可以按照您指定的范围提供脱敏信息。
感谢您的帮助!