背景
host 應用把 @rytass/bpm-core-nestjs-module 掛在自己的全域驗證 guard 之後時,需要知道哪些 Nest module 是 BPM 提供的,才能把 BPM 自己的 resolver 與 controller 從 host guard 豁免掉
原因是 BPM 內建自己的 BPMAdminGuard 與 BPMAuthenticatedGuard,其 handler 不帶 host 層的驗證裝飾器,host 的全域 guard 會直接 defaultDeny
目前套件沒有提供任何列舉模組的方式,host 只能硬編碼一組 module class name,再比對 moduleRef.metatype.name
問題
硬編碼的那組清單是某一個版本的快照
當 BPM 新增 module 時,host 的豁免範圍不會跟著擴大,新 module 底下所有 resolver 的請求會被 host guard 擋掉,而且是對所有人包含 admin
以實際遇到的情況為例,升到 0.10.0 後多了兩個 module(FormDataSourceModule 與 CalendarModule),兩個都不在 host 既有的清單裡,結果是:
- 這兩個 module 的所有 query 一律回
Forbidden resource
- 表單設計器的「選項來源」功能看起來永遠不可用,靜默退化成只剩靜態選項
Forbidden resource 這串原始錯誤訊息直接顯示在流程設計頁面上
整個過程 build 與 startup 都不會失敗,host 端沒有任何訊號可以察覺清單已經不完整
為什麼這屬於上游
任何把此套件掛在自有 guard 後方的 host 都會遇到同一件事,而且失效模式每次都一樣:安靜、連 admin 都被擋、只有在有人發現某個功能不見時才會被察覺
host 端無法自行偵測,除非每次升版都手動 diff 模組匯出
建議做法
- 匯出模組清單 — 由套件提供
BPM_MODULE_NAMES(或 BPM_MODULES)常數,host 比對當前版本而不是自己維護快照
- 在 BPM 提供的 class 上標記 metadata — 例如
@BPMProvided() 裝飾器或反射用的 metadata key,讓 host 用結構判斷而不是靠名稱比對
- 至少寫進文件 — 若前兩者都不採用,也請在整合文件標明這份清單的存在與升版時必須複查,讓 host 端能自行加上檢查
做法 2 最穩固,因為 module 改名也不會失效
做法 1 改動最小,但已經足以消除「靜默失效」這個問題
版本
@rytass/bpm-core-nestjs-module@0.10.0
背景
host 應用把
@rytass/bpm-core-nestjs-module掛在自己的全域驗證 guard 之後時,需要知道哪些 Nest module 是 BPM 提供的,才能把 BPM 自己的 resolver 與 controller 從 host guard 豁免掉原因是 BPM 內建自己的
BPMAdminGuard與BPMAuthenticatedGuard,其 handler 不帶 host 層的驗證裝飾器,host 的全域 guard 會直接 defaultDeny目前套件沒有提供任何列舉模組的方式,host 只能硬編碼一組 module class name,再比對
moduleRef.metatype.name問題
硬編碼的那組清單是某一個版本的快照
當 BPM 新增 module 時,host 的豁免範圍不會跟著擴大,新 module 底下所有 resolver 的請求會被 host guard 擋掉,而且是對所有人包含 admin
以實際遇到的情況為例,升到
0.10.0後多了兩個 module(FormDataSourceModule與CalendarModule),兩個都不在 host 既有的清單裡,結果是:Forbidden resourceForbidden resource這串原始錯誤訊息直接顯示在流程設計頁面上整個過程 build 與 startup 都不會失敗,host 端沒有任何訊號可以察覺清單已經不完整
為什麼這屬於上游
任何把此套件掛在自有 guard 後方的 host 都會遇到同一件事,而且失效模式每次都一樣:安靜、連 admin 都被擋、只有在有人發現某個功能不見時才會被察覺
host 端無法自行偵測,除非每次升版都手動 diff 模組匯出
建議做法
BPM_MODULE_NAMES(或BPM_MODULES)常數,host 比對當前版本而不是自己維護快照@BPMProvided()裝飾器或反射用的 metadata key,讓 host 用結構判斷而不是靠名稱比對做法 2 最穩固,因為 module 改名也不會失效
做法 1 改動最小,但已經足以消除「靜默失效」這個問題
版本
@rytass/bpm-core-nestjs-module@0.10.0