本卡屬 FR-114 資安修正(母卡 CM-2019),189 升級 1.21.0 手測撞到、首腦以升級前備份差集實證,收集卡 CM-2231 #42。每條升級路徑都會踩,b5 必修。只改 BE 主線一支模板+補守衛測試;189/190 資料還原由首腦另做。

問題是什麼(白話)

安裝版每次升級尾端(migrate.sh 第三輪)會跑一支「角色回補」SQL,用意是:既有租戶的管理員角色補上新版才出現的能力點,不然升級後管理員看不到新功能。但它判斷「哪個角色是管理員」的方法是**「誰持有 flow_template.create(建流程範本)這個能力點」,而不是角色表本來就有的 roles.is_admin 旗標。任何一般角色只要曾被手動勾過那一個能力點,升級時就被當管理員,一次塞進全部**非平台能力點(含租戶/角色/使用者/LDAP/SMTP 的增刪改)。

首腦已核的證據:189 升級前備份(189:~/guidant-backup-1.19.0-before-1.21.0-20260928_1059.dump,首腦還原到本機 tmp_189_pre)比對升級後:IT Manager(id=4,is_admin=0)89→98 個能力點,多出 tenant./audit./feedback.export 等 15 個;專案管理員(PM)(id=5,is_admin=0)58→98,多出 45 個(含 role./ldap-config./smtp-config./storage-config. 全部)。兩者升級前都持有 flow_template.create。190 的專案管理員-PM(id=7)同樣 98。188 只有 System Manager(is_admin=1)持有,未中。新租戶建立時的邏輯(jedi-iam tenant_provisioning_service.py:149)本來就是用 roles.is_admin = 1,回補這支跟它不一致。

在哪裡

/Users/chouraymond/Projects/Billows/Audit-Manager/compliance-manager-be/.claude/worktrees/wt-fix-security/scripts/init/migrate-capability-grants.sql:59-90   (b) 段::72 計數與 :81 INSERT 子查詢都用 b.name = 'flow_template.create' 推導管理員角色
/Users/chouraymond/Projects/Billows/Audit-Manager/compliance-manager-be/.claude/worktrees/wt-fix-security/scripts/build/flatten_pkg_migrations.sh:261-285    模板 → scripts/sql/packages/_capability_grants.sql 產物(build 期產、不入版控)
/Users/chouraymond/Projects/Billows/Audit-Manager/compliance-manager-be/.claude/worktrees/wt-fix-security/scripts/init/migrate.sh:38-70                       第三輪:每次升級都跑、不登記
對照(正確判準):jedi-iam jedi_iam/app/service/tenant_provisioning_service.py:149  roles.is_admin = 1

怎麼修

手測(DEV localhost:5432)

連帶

紀律