From 4513896112be5a95f215f398099653e92e685a63 Mon Sep 17 00:00:00 2001 From: tristan Date: Wed, 24 Jun 2026 10:29:54 +0200 Subject: [PATCH] docs(audit) : documente le contexte forensique du journal --- CLAUDE.md | 1 + doc/audit-logging.md | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/CLAUDE.md b/CLAUDE.md index 3cbd374..8e346f3 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -208,6 +208,7 @@ - All processors that modify entities impacting calculations (heures, absences, contrats, RTT) MUST inject `AuditLogger` and log create/update/delete actions - `AuditLogger::log()` persists without flushing — the processor's `flush()` handles both the data change and the audit entry atomically - Audit logs are accessible only via `ROLE_SUPER_ADMIN` (hidden role, added manually in DB) +- **Contexte forensique automatique** : chaque entrée capte aussi `ipAddress`, `userAgent` (brut), `deviceLabel` (libellé lisible via `App\Service\UserAgentParser`) et `deviceId` (header `X-Device-Id`, device id persistant `localStorage['sirh-device-id']` envoyé par le front depuis `useApi`/`useDeviceId`). Capture centralisée dans `AuditLogger::log()` via `RequestStack` (null en contexte CLI). But : distinguer les appareils derrière un compte partagé (ex. « Usine »). IP fiable derrière proxy → activer `framework.trusted_proxies`. Affichage écran (`audit-logs.vue`) non couvert (refonte séparée). Doc : `doc/audit-logging.md`. - Documentation: `doc/audit-logging.md` ## Backend Conventions diff --git a/doc/audit-logging.md b/doc/audit-logging.md index 971bca1..c5b8c7c 100644 --- a/doc/audit-logging.md +++ b/doc/audit-logging.md @@ -40,6 +40,12 @@ Chaque entrée contient : - **changes** : diff JSON `{old: {...}, new: {...}}` avec les anciennes/nouvelles valeurs - **affectedDate** : date de travail ou début d'absence (pour filtrage par période) - **createdAt** : horodatage de l'action +- `ipAddress` : IP source de la requête (`Request::getClientIp()`) — nécessite `framework.trusted_proxies` derrière un reverse proxy, sinon IP du proxy +- `userAgent` : User-Agent brut de la requête +- `deviceLabel` : libellé lisible dérivé du User-Agent (`Type · OS · Navigateur`, ex. `Mobile · Android · Chrome`), via `App\Service\UserAgentParser` +- `deviceId` : identifiant d'appareil persistant envoyé par le front (header `X-Device-Id`, stocké en `localStorage['sirh-device-id']`). Distingue les **appareils** derrière un compte partagé (ex. « Usine »), pas les personnes. + +Capture : automatique et centralisée dans `AuditLogger::log()` (via `RequestStack`) — aucun processor à modifier. En contexte CLI/cron (pas de requête), ces 4 champs restent `null`. ## Filtres disponibles