test-spec.md 4.8 KB

动态低代码页面数据权限测试规格

1. 测试目标

  • 验证低代码动态 CRUD 在 FOLLOW_SYSTEM 策略下复用当前登录人的系统角色数据范围。
  • 验证默认 TENANT 策略保持历史兼容,只做租户隔离和逻辑删除过滤。
  • 验证读写接口都由后端追加权限条件,前端只负责配置和展示。
  • 验证角色数据范围新旧编码兼容,历史角色升级后不会被错误解释。

2. 基础测试数据

建议准备一张低代码业务表,至少包含以下列:

列名 用途
id 主键
tenant_id 租户隔离
create_by 本人数据范围
org_id 业务归属组织
create_dept 创建部门兜底组织字段
region_code 行政区划数据范围
parent_id 树形父级
del_flag 逻辑删除

低代码模型策略:

  • 兼容策略:dataScope=TENANT
  • 系统策略:dataScope=FOLLOW_SYSTEM,字段映射为 userColumn=create_byorgColumn=org_idregionColumn=region_codetenantColumn=tenant_idlogicDeleteColumn=del_flag

3. 角色范围矩阵

角色数据范围 预期条件 验收点
1 全部 不追加组织、本人、区划条件 仍保留动态仓储的租户和逻辑删除基础过滤
2 本租户 tenant_id = 当前租户 可见同租户数据,不跨租户
3 本组织 org_id IN 当前用户组织 只看本组织数据
4 本组织及子组织 org_id IN 当前组织及所有子组织 子组织数据可见,兄弟组织不可见
5 个人 create_by = 当前用户 无自定义组织 ID 时按个人执行
5 自定义组织兼容 org_id IN sys_role_data_scope 存在自定义组织 ID 时按旧枚举 CUSTOM 执行
6 本租户兼容 tenant_id = 当前租户 兼容旧后端枚举
7 行政区划 region_code = 当前区划 OR 直接下级区划 省级用户视为全部;市级及以下匹配本级和下级

4. 接口验收用例

场景 接口 预期
单表分页 GET /ai/crud/{configKey}/page 返回结果满足当前角色数据范围
Join 分页 GET /ai/crud/{configKey}/page,带 Join 运行时配置 按主表别名 t0 追加权限条件
树形查询 GET /ai/crud/{configKey}/tree 只返回有权限节点,并补齐导航祖先节点
详情 GET /ai/crud/{configKey}/{id} 越权 ID 返回无权限或不存在业务异常
编辑 PUT /ai/crud/{configKey} 越权 ID 影响行数为 0 时返回业务异常
删除 DELETE /ai/crud/{configKey}/{id} 越权 ID 不允许删除
批量删除 前端批量触发单条删除接口 任一越权记录不能静默成功
自定义查询 POST /ai/custom-query/{configKey}/execute 字段白名单和动态数据权限同时生效
导出 POST /ai/crud/{configKey}/export 导出结果与分页权限结果一致

5. 发布校验用例

场景 预期
FOLLOW_SYSTEM 缺少 tenantColumn 发布失败并提示缺少租户字段映射
FOLLOW_SYSTEM 缺少 userColumn 发布失败并提示缺少本人数据权限字段
FOLLOW_SYSTEM 缺少 orgColumn 发布失败并提示缺少组织数据权限字段
配置字段存在于模型但真实表列不存在 发布失败并提示字段不存在
SYSTEM_DATA_SCOPE 历史值 保存、发布、运行时归一化为 FOLLOW_SYSTEM
默认空策略 归一化为 TENANT,不改变历史页面行为

6. 树形与组织筛选用例

场景 预期
左树右表选择父级并勾选查询子级 查询值扩展为父级和子级集合
查询子级结果超出角色范围 与系统权限取交集,不扩大可见范围
补齐祖先节点 返回 _scopeAncestor=true_dataScopeWritable=false
操作补齐祖先节点 前端阻断编辑、删除、添加下级;后端写接口仍按权限条件校验

7. 验证命令

cd forge
JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home mvn -pl forge-admin-server -am compile -DskipTests

cd ../forge-admin-ui
source ~/.nvm/nvm.sh && nvm use v20.19.0
pnpm exec eslint src/components/ai-form/AiCrudPage.vue src/components/lowcode-builder/model/model-schema.js src/components/lowcode-builder/model/LowcodeModelDesigner.vue src/views/ai/lowcode-builder.vue src/views/ai/lowcode-models.vue
pnpm build

8. 当前验证结果

  • 后端 Maven 编译通过。
  • 前端定向 ESLint 通过。
  • 前端 build 通过;存在既有 UnoCSS missing-icon、CSS // 注释、动态导入提示和 chunk-size warning,不阻断产物生成。
  • 接口级角色矩阵需在具备真实用户、角色、组织、区划和低代码业务数据的环境中回归。