本卡屬 FR-132(母卡 CM-2510),A.3 判定層第 10 張。來源:A.5 開卡時 opus 查到、首腦開檔核實。依賴:T-3.8 補件(
iam.user.assign已開)。建議 model:opus。優先度高:A.5 指派頁一上線,使用者設的到期日會被任何一次存帳號默默清掉。
管理員在帳號管理頁改一個人的電話並儲存,或那個人自己改個人資料儲存,後端都會把他「所有角色指派刪掉、照送來的清單重建」。重建時不帶生效日與到期日,所以原本「稽核員,至 2026-12-31 到期」存一次帳號就變成「永久」,畫面不報錯、沒人知道。T-3.8 做了獨立的指派 API 之後,到期日會是常用功能,這條路不堵掉指派頁等於白做。
~/Projects/Jedicogy/module/jedi-python-package/jedi-iam/jedi_iam/app/service/user_service.py:277-288 update_user 把 payload 的 user_roles 轉 UserRoleEntity,只帶 role_uid/tenant_id/org_unit_id/scope/is_default,沒有 starts_at/ends_at
~/Projects/Jedicogy/module/jedi-python-package/jedi-iam/jedi_iam/app/service/user_service.py:352 delete_user_role_by_user_id(user.id) 全刪
~/Projects/Jedicogy/module/jedi-python-package/jedi-iam/jedi_iam/app/service/user_service.py:371 add_user_roles 重建
~/Projects/Jedicogy/module/jedi-python-package/jedi-iam/jedi_iam/api/routes/user_route.py PUT /user/<uid>(管理員改帳號)與 PUT /user-profile/<uid>(本人改個人資料,從既有指派重組 user_roles 再送進同一條,同樣漏起訖)
~/Projects/Billows/Audit-Manager/compliance-manager-fe/src/views/user-manage/UserProfileForm.vue:189 FE 送 user_roles 的地方(A.5 T-5.5 會改成不送)
user_roles(鍵不存在)就完全不動指派:update_user 以 "user_roles" in kwargs 判斷,不是用空清單判斷(空清單=明確要清空)。本人改個人資料那條(PUT /user-profile/<uid>)route 層不再重組 user_roles 送進來。user_roles 時改成差異更新,不全刪重建:以(role_id, tenant_id, org_unit_id)為 key,清單裡有、DB 沒有的新增;DB 有、清單沒有的刪除;兩邊都有的原列不動(起訖、is_default、created_at 全保留)。T-3.8 補件已把 UserRole 加 __skip_auto_org_unit__,新增的列不會再被蓋部門。user_roles 且非空時要 iam.user.assign(T-3.8 補件已在 service 層加,確認你的改法沒把它繞掉)。delete_user_role_by_user_id 全部呼叫端(含建租戶、匯入使用者),確認只有 update_user 這條在用全刪重建;其他呼叫端若也漏起訖一併回寫。update_user 不帶 user_roles → 指派不變(含 ends_at)。SELECT ends_at FROM user_roles 那筆仍是明天。測完刪指派。pytest test/test_module_boundaries.py(3 條 seed 紅是既有基線);當次叫 ddd-compliance-reviewer 掃 diff。