security: invalidate session immediately when member is removed from household #56

Open
opened 2026-04-10 18:24:46 +02:00 by marcel · 0 comments
Owner

Beschreibung

Wenn ein Mitglied aus einem Haushalt entfernt wird, bleibt dessen aktive Session bis zum natürlichen Session-Timeout gültig. Das entfernte Mitglied hat in dieser Zeit noch vollen Zugang zur App.

Problem

DELETE /v1/households/mine/members/{userId} entfernt das Mitglied aus der DB, invalidiert aber nicht die laufende HTTP-Session des betroffenen Users.

Lösung

Spring Security SessionRegistry + SessionInformation.expireNow() verwenden, um die Session des entfernten Mitglieds sofort zu invalidieren:

sessionRegistry.getAllSessions(removedUser, false)
    .forEach(SessionInformation::expireNow);

Voraussetzung: SessionRegistry muss in der SecurityFilterChain registriert sein (sessionManagement().sessionRegistry(...)).

Akzeptanzkriterien

  • Nach DELETE /v1/households/mine/members/{userId} wird die aktive Session des entfernten Mitglieds sofort invalidiert
  • Der nächste Request des entfernten Mitglieds erhält 401 Unauthorized
  • Integrations-Test: Member wird entfernt → Session-Request danach → 401

Kontext

Aufgedeckt in #48 (Sable — Security Review). Wurde bewusst aus dem Members-Ticket herausgezogen, um den Scope nicht zu sprengen.

## Beschreibung Wenn ein Mitglied aus einem Haushalt entfernt wird, bleibt dessen aktive Session bis zum natürlichen Session-Timeout gültig. Das entfernte Mitglied hat in dieser Zeit noch vollen Zugang zur App. ## Problem `DELETE /v1/households/mine/members/{userId}` entfernt das Mitglied aus der DB, invalidiert aber nicht die laufende HTTP-Session des betroffenen Users. ## Lösung Spring Security `SessionRegistry` + `SessionInformation.expireNow()` verwenden, um die Session des entfernten Mitglieds sofort zu invalidieren: ```java sessionRegistry.getAllSessions(removedUser, false) .forEach(SessionInformation::expireNow); ``` Voraussetzung: `SessionRegistry` muss in der `SecurityFilterChain` registriert sein (`sessionManagement().sessionRegistry(...)`). ## Akzeptanzkriterien - [ ] Nach `DELETE /v1/households/mine/members/{userId}` wird die aktive Session des entfernten Mitglieds sofort invalidiert - [ ] Der nächste Request des entfernten Mitglieds erhält `401 Unauthorized` - [ ] Integrations-Test: Member wird entfernt → Session-Request danach → `401` ## Kontext Aufgedeckt in #48 (Sable — Security Review). Wurde bewusst aus dem Members-Ticket herausgezogen, um den Scope nicht zu sprengen.
Sign in to join this conversation.