feat(security): enforcement — filtrage caméra dans les endpoints sensibles #175

Merged
nonobis merged 1 commit from feat/feat-enforcement-appliquer-le-filtrage-cam-ra-dans into main 2026-08-27 20:28:42 +02:00
Owner

Contexte

Le filtrage par ICameraAccessService doit être appliqué partout où des données caméra sont retournées. Actuellement, l'accès est contrôlé uniquement au niveau site (UserSite) — un utilisateur avec accès à un site peut voir TOUTES les caméras de ce site, même si certaines lui sont interdites.

Tickets liés

Changements

  • UserCamera entity : table de jonction user ↔ camera (comme UserSite mais au niveau caméra)
  • ICameraAccessService : interface + implémentation avec bypass admin, fallback UserCamera → UserSite
  • MonitoringHub : vérifie l'accès caméra avant de rejoindre le groupe de monitoring site
  • Events API : filtrage par caméras accessibles (GetEvents, GetRecentByCamera, GetEvent)
  • Tests : mis à jour pour le nouvel attribut ICameraAccessService

Architecture de l'accès

UserCamera entry exists? → use it (camera-level)
No UserCamera entry? → fallback to UserSite (site-level)
Admin role? → bypass all checks (always true)

Tests

  • dotnet build : 0 erreur, 0 warning
  • dotnet format whitespace : aucun formatage nécessaire
  • dotnet test : 466/468 vert (2 échecs pré-existants sur main : DeleteSiteHandlerTests, UpdateCameraHandlerTests)

Notes

  • Pas de migration EF Core incluse — à générer séparément avec dotnet ef migrations add AddUserCamera
  • Persons et Faces restent globaux (pas de filtrage caméra) — ce sont des entités globales, pas liées à une caméra spécifique
  • Le userId est extrait des claims JWT (ClaimTypes.NameIdentifier ou sub)
  • ICameraAccessService est scoped (pas singleton) — dépend de IApplicationDbContext
## Contexte Le filtrage par `ICameraAccessService` doit être appliqué partout où des données caméra sont retournées. Actuellement, l'accès est contrôlé uniquement au niveau site (`UserSite`) — un utilisateur avec accès à un site peut voir TOUTES les caméras de ce site, même si certaines lui sont interdites. ## Tickets liés - Fixes #139 ## Changements - **UserCamera entity** : table de jonction user ↔ camera (comme UserSite mais au niveau caméra) - **ICameraAccessService** : interface + implémentation avec bypass admin, fallback UserCamera → UserSite - **MonitoringHub** : vérifie l'accès caméra avant de rejoindre le groupe de monitoring site - **Events API** : filtrage par caméras accessibles (GetEvents, GetRecentByCamera, GetEvent) - **Tests** : mis à jour pour le nouvel attribut ICameraAccessService ## Architecture de l'accès ``` UserCamera entry exists? → use it (camera-level) No UserCamera entry? → fallback to UserSite (site-level) Admin role? → bypass all checks (always true) ``` ## Tests - `dotnet build` : 0 erreur, 0 warning - `dotnet format whitespace` : aucun formatage nécessaire - `dotnet test` : 466/468 vert (2 échecs pré-existants sur main : DeleteSiteHandlerTests, UpdateCameraHandlerTests) ## Notes - Pas de migration EF Core incluse — à générer séparément avec `dotnet ef migrations add AddUserCamera` - Persons et Faces restent globaux (pas de filtrage caméra) — ce sont des entités globales, pas liées à une caméra spécifique - Le userId est extrait des claims JWT (`ClaimTypes.NameIdentifier` ou `sub`) - `ICameraAccessService` est scoped (pas singleton) — dépend de `IApplicationDbContext`
feat(security): enforce camera-level access control in endpoints (Fixes #139)
Some checks failed
CI / Docker + Trivy (pull_request) Has been skipped
CI / Détection changements (pull_request) Successful in 39s
CI / OWASP Dependency-Check (pull_request) Has been skipped
CI / Docker PR (pull_request) Failing after 4m54s
Auto-Fix / Auto-Fix (pull_request) Successful in 10m12s
CI / Build + Format (pull_request) Successful in 11m35s
CI / Tests DB (Infrastructure) (pull_request) Failing after 6m46s
CI / Tests unitaires (pull_request) Failing after 8m4s
CI / Tests Web (bUnit) (pull_request) Failing after 9m1s
CI / Tests DB (Integration) (pull_request) Failing after 9m15s
CI / Résumé tests (PR) (pull_request) Successful in 4s
CI / SonarQube (pull_request) Successful in 13m10s
CI / ci (pull_request) Failing after 1s
95da11e959
- Add UserCamera entity (junction table: user ↔ camera)
- Add ICameraAccessService + CameraAccessService (admin bypass, UserCamera → UserSite fallback)
- MonitoringHub: verify user has camera access before joining site group
- Events API: filter by accessible cameras (GetEvents, GetRecentByCamera, GetEvent)
- Register ICameraAccessService in DI (scoped)
- Update tests for new ICameraAccessService dependency
- dotnet format whitespace compliant

🤖 Résumé des tests

Tests unitaires

Pas de résultats (job skippé)


Tests Web (bUnit)

Pas de résultats


Tests DB (Infrastructure)

Pas de résultats

Généré automatiquement par la CI.

## 🤖 Résumé des tests ## Tests unitaires _Pas de résultats (job skippé)_ --- ## Tests Web (bUnit) _Pas de résultats_ --- ## Tests DB (Infrastructure) _Pas de résultats_ _Généré automatiquement par la CI._
nonobis deleted branch feat/feat-enforcement-appliquer-le-filtrage-cam-ra-dans 2026-08-27 20:28:42 +02:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
nonobis/Heimdall!175
No description provided.