Skip to content

沒有匯出 BPM 模組清單,host 只能硬編碼快照,升版時會靜默失效 #30

Description

@coollugi

背景

host 應用把 @rytass/bpm-core-nestjs-module 掛在自己的全域驗證 guard 之後時,需要知道哪些 Nest module 是 BPM 提供的,才能把 BPM 自己的 resolver 與 controller 從 host guard 豁免掉

原因是 BPM 內建自己的 BPMAdminGuardBPMAuthenticatedGuard,其 handler 不帶 host 層的驗證裝飾器,host 的全域 guard 會直接 defaultDeny

目前套件沒有提供任何列舉模組的方式,host 只能硬編碼一組 module class name,再比對 moduleRef.metatype.name

問題

硬編碼的那組清單是某一個版本的快照

當 BPM 新增 module 時,host 的豁免範圍不會跟著擴大,新 module 底下所有 resolver 的請求會被 host guard 擋掉,而且是對所有人包含 admin

以實際遇到的情況為例,升到 0.10.0 後多了兩個 module(FormDataSourceModuleCalendarModule),兩個都不在 host 既有的清單裡,結果是:

  • 這兩個 module 的所有 query 一律回 Forbidden resource
  • 表單設計器的「選項來源」功能看起來永遠不可用,靜默退化成只剩靜態選項
  • Forbidden resource 這串原始錯誤訊息直接顯示在流程設計頁面上

整個過程 build 與 startup 都不會失敗,host 端沒有任何訊號可以察覺清單已經不完整

為什麼這屬於上游

任何把此套件掛在自有 guard 後方的 host 都會遇到同一件事,而且失效模式每次都一樣:安靜、連 admin 都被擋、只有在有人發現某個功能不見時才會被察覺

host 端無法自行偵測,除非每次升版都手動 diff 模組匯出

建議做法

  1. 匯出模組清單 — 由套件提供 BPM_MODULE_NAMES(或 BPM_MODULES)常數,host 比對當前版本而不是自己維護快照
  2. 在 BPM 提供的 class 上標記 metadata — 例如 @BPMProvided() 裝飾器或反射用的 metadata key,讓 host 用結構判斷而不是靠名稱比對
  3. 至少寫進文件 — 若前兩者都不採用,也請在整合文件標明這份清單的存在與升版時必須複查,讓 host 端能自行加上檢查

做法 2 最穩固,因為 module 改名也不會失效
做法 1 改動最小,但已經足以消除「靜默失效」這個問題

版本

@rytass/bpm-core-nestjs-module@0.10.0

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions