設計正本: ADR-0006 §3.4 step8 / §3.3、基本設計書 §4.2.6 / §6.2.3。webapi 側 audit_logs の記録ギャップと、設計書↔enum のアクション語彙乖離を埋める。
背景
スコープ(記録実装)
AuditEventType に ANONYMIZE / LOGIN_FAILED を追加
匿名化 step8(SPI 側のみ ): SPI removeUser(Keycloak JVM)で匿名化と同 transaction に audit_logs へ action=ANONYMIZE, entity_type='users', entity_id=user.id を JDBC 直書き (ADR-0006 §3.4)
webapi 側は対象外・将来委譲 : webapi の匿名化呼び出し経路(解約・退会 API)が未実装のため webapi 側 ANONYMIZE 記録は実装できない。解約・退会 API 実装時(Phase 2、feature: テナント解約(物理削除/データ凍結)設計 [Phase 2] #167 圏)に委譲 する
hash_chain 注意 : SPI の JDBC 直書きは AuditLogPersistenceAdapter と同一の hash_chain(前レコード SHA-256)計算を踏襲し、改ざん検知チェーンを壊さないこと
認証失敗: TasksAuthenticationEntryPoint(webapi、実装済み)で LOGIN_FAILED を記録(detail = USER_NOT_REGISTERED / USER_INACTIVE / USER_ANONYMIZED。USER_ANONYMIZED は監査必須)
孤児 TODO(#144) 5箇所を repoint:
TasksAuthenticationEntryPoint LOGIN_FAILED ×3 → 本 issue(本 issue で実装)
UserAnonymizationDomainService step8 ×1 / User.java doc ×1 → webapi 側記録は将来(feature: テナント解約(物理削除/データ凍結)設計 [Phase 2] #167 圏)である旨に repoint(削除せず追跡を残す )。SPI 側記録は本 issue。
スコープ(アクション語彙整合 ※記録配線は別 issue)
*_DENIED 8値(VIEW_DENIED/EDIT_DENIED/DELETE_DENIED/STATUS_CHANGE_DENIED/VISIBILITY_CHANGE_DENIED/STAKEHOLDER_EDIT_DENIED/TENANT_CROSSED/ROLE_BASED_DENIED)を AuditEventType に語彙として追加 (各シナリオの記録配線は別 issue [Phase 1 Sprint 2.5] feat(audit): 認可違反の audit_logs 記録配線(*_DENIED 8値, §6.2.3) #736 )
命名統一: enum CROSS_TENANT_VIOLATION_ATTEMPT ↔ 設計 §6.2.3 TENANT_CROSSED の整合(どちらに寄せるか本 issue で確定し、enum・利用箇所・設計書を揃える)
ANONYMIZE を基本設計書 §4.2.6 の action 標準値一覧に追記(doc 同期。LOGIN_FAILED/*_DENIED は既載)
受け入れ条件
関連: ADR-0006 / 基本設計書 §4.2.6・§6.2.3 / #730 (audit 条件の移譲元)/ #144 (無関係・誤参照だった)/ #736 (*_DENIED 記録配線)/ #167 (Phase2 解約 — webapi 側 ANONYMIZE 記録の将来委譲先)
設計正本: ADR-0006 §3.4 step8 / §3.3、基本設計書 §4.2.6 / §6.2.3。webapi 側 audit_logs の記録ギャップと、設計書↔enum のアクション語彙乖離を埋める。
背景
UserAnonymizationDomainService(step8)とTasksAuthenticationEntryPoint(LOGIN_FAILED 3件)、User.javadoc にTODO(#144)が残る。しかし 監査列(created_at / updated_at / created_by / updated_by)の Auditing 機構整備 #144 は JPA 監査列(created_by等)整備で「対象外: users テーブル」明記・close 済み → 孤児 TODO(「auditing」の語取り違え)。AuditLogPort/AuditLogPersistenceAdapter+ hash chain)は実装済み。AuditEventTypeenum は設計書 §4.2.6/§6.2.3 の標準値と乖離(ANONYMIZE/LOGIN_FAILED/*_DENIED8値が未反映、命名差あり)。UserAnonymizationDomainService.anonymizeは実装済みだが webapi 側に呼び出し元が無い(解約・退会 UseCase 未実装)。匿名化が実際に走るのは SPIremoveUser([Phase 1 Sprint 2.5] infra(keycloak): User Storage SPI Provider 実装本体(Lookup/Query/Registration + email write-back) #728 / feat(keycloak): User Storage SPI 本体実装(Lookup/Query/Registration + email write-back)(#728) #732 実装済み)のみ。スコープ(記録実装)
AuditEventTypeにANONYMIZE/LOGIN_FAILEDを追加removeUser(Keycloak JVM)で匿名化と同 transaction に audit_logs へaction=ANONYMIZE, entity_type='users', entity_id=user.idを JDBC 直書き(ADR-0006 §3.4)AuditLogPersistenceAdapterと同一の hash_chain(前レコード SHA-256)計算を踏襲し、改ざん検知チェーンを壊さないことTasksAuthenticationEntryPoint(webapi、実装済み)でLOGIN_FAILEDを記録(detail = USER_NOT_REGISTERED / USER_INACTIVE / USER_ANONYMIZED。USER_ANONYMIZED は監査必須)TODO(#144)5箇所を repoint:TasksAuthenticationEntryPointLOGIN_FAILED ×3 → 本 issue(本 issue で実装)UserAnonymizationDomainServicestep8 ×1 /User.javadoc ×1 → webapi 側記録は将来(feature: テナント解約(物理削除/データ凍結)設計 [Phase 2] #167 圏)である旨に repoint(削除せず追跡を残す)。SPI 側記録は本 issue。スコープ(アクション語彙整合 ※記録配線は別 issue)
*_DENIED8値(VIEW_DENIED/EDIT_DENIED/DELETE_DENIED/STATUS_CHANGE_DENIED/VISIBILITY_CHANGE_DENIED/STAKEHOLDER_EDIT_DENIED/TENANT_CROSSED/ROLE_BASED_DENIED)をAuditEventTypeに語彙として追加(各シナリオの記録配線は別 issue [Phase 1 Sprint 2.5] feat(audit): 認可違反の audit_logs 記録配線(*_DENIED 8値, §6.2.3) #736)CROSS_TENANT_VIOLATION_ATTEMPT↔ 設計 §6.2.3TENANT_CROSSEDの整合(どちらに寄せるか本 issue で確定し、enum・利用箇所・設計書を揃える)ANONYMIZEを基本設計書 §4.2.6 の action 標準値一覧に追記(doc 同期。LOGIN_FAILED/*_DENIED は既載)受け入れ条件
AuditEventTypeに ANONYMIZE / LOGIN_FAILED 追加、CI 通過removeUser経由で audit_logs に ANONYMIZE が記録(hash_chain 整合維持)。webapi 側記録は本 issue 対象外(feature: テナント解約(物理削除/データ凍結)設計 [Phase 2] #167 圏へ委譲を明記)TODO(#144)参照を repoint 済み(LOGIN_FAILED / SPI ANONYMIZE → 本 issue、webapi ANONYMIZE → feature: テナント解約(物理削除/データ凍結)設計 [Phase 2] #167 圏)*_DENIED8値が enum に追加(記録配線は [Phase 1 Sprint 2.5] feat(audit): 認可違反の audit_logs 記録配線(*_DENIED 8値, §6.2.3) #736 で実施)CROSS_TENANT_VIOLATION_ATTEMPT/TENANT_CROSSEDの命名統一を確定し enum・利用箇所・設計書 §6.2.3 を整合関連: ADR-0006 / 基本設計書 §4.2.6・§6.2.3 / #730(audit 条件の移譲元)/ #144(無関係・誤参照だった)/ #736(*_DENIED 記録配線)/ #167(Phase2 解約 — webapi 側 ANONYMIZE 記録の将来委譲先)