Files
huang a30b3036bb
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 6m10s
feat(iot-card-import): 为导入任务接口添加平台用户权限控制
- 在 Import/List/GetByID 接口添加用户类型校验
- 仅超级管理员和平台用户可访问
- 同步更新 OpenAPI 路由描述
- 补充集成测试覆盖权限拒绝场景
2026-02-02 10:25:03 +08:00

3.2 KiB
Raw Blame History

Context

当前后台接口中,设备导入任务相关接口在 Handler 层做了“仅平台用户/超级管理员可访问”的用户类型校验(基于 middleware.GetUserTypeFromContext + constants.UserTypeSuperAdmin/UserTypePlatform)。

IoT 卡导入任务相关接口(提交导入、任务列表、任务详情)未做同等校验,导致权限边界与设备导入不一致。

本变更目标是将 IoT 卡导入任务相关接口的访问权限收敛为与设备导入一致:仅超级管理员与平台用户可访问。

Goals / Non-Goals

Goals:

  • 对以下 3 个接口增加用户类型校验:仅允许超级管理员与平台用户访问。
  • 返回行为与现有模式一致:非允许用户类型直接返回 403errors.CodeForbidden),错误消息使用中文。
  • OpenAPI 路由描述与实际权限一致。
  • 补齐/新增集成测试,覆盖非平台用户访问应被拒绝。

Non-Goals:

  • 不调整导入任务的数据模型与存储逻辑。
  • 不引入新的 RBAC 权限点或权限表配置(保持“用户类型硬校验”的现有风格)。
  • 不改动其他 IoT 卡管理接口的权限策略。

Decisions

  1. 在 Handler 层做用户类型校验(与设备导入对齐)
  • 方案:在 internal/handler/admin/iot_card_import.goImport / List / GetByID 入口处增加与 internal/handler/admin/device_import.go 同风格的校验。
  • 理由:
    • 与现有“设备导入”实现一致,减少认知负担。
    • 校验发生在参数解析与业务调用前,能最早拒绝无权限请求。
  • 备选方案:
    • 路由层中间件:更集中,但需要在路由注册处引入新中间件组合,且当前设备导入并未采用该方式。
    • Service 层校验:更“业务化”,但会改变当前导入模块的职责边界(设备导入限制目前在 Handler 层)。
  1. 错误码与错误消息遵循现有约定
  • 方案:使用 errors.New(errors.CodeForbidden, "仅平台用户可...") 风格,保持与设备导入一致。
  • 理由:该模块已有同类错误消息,避免引入新的错误码或文案风格。
  1. 同步更新路由描述OpenAPI
  • 方案:在 internal/routes/iot_card.go 对相关接口补充 Description: "仅平台用户可操作。"(与设备导入相同语义)。
  • 理由:避免文档与实际行为不一致,减少前后端联调成本。

Risks / Trade-offs

  • [风险] 规格与实现不一致缓解:在本变更的 specsdelta spec中明确将权限收敛为平台用户/超管,并在实现阶段对齐。
  • [风险] 测试缺口导致回归缓解:新增集成测试覆盖非平台用户访问 403并尽量复用现有测试基建集成测试 env

Migration Plan

  • 该变更为权限收敛,无数据迁移。
  • 发布后影响:非平台用户/超管将无法调用 IoT 卡导入与导入任务查询接口。
  • 回滚策略:如业务需要恢复原可见性,可回滚本变更提交(或通过后续变更重新放开)。

Open Questions

  • 是否需要将错误消息文案统一为同一句(如“仅平台用户可操作”),还是分别保留更具体的文案(导入/列表/详情)?(实现阶段可按现有 device_import 文案对齐)