fix(backend): Gruppen-Rechte fuer Mitglieder korrigieren (edit-group OR member) #228

Closed
opened 2026-07-05 13:00:22 +00:00 by niboer · 0 comments
Owner

Beschreibung

Ein Mitglied eines Haushalts (Gruppe) kann aktuell nur Aktionen ausfuehren, wenn es die edit-group-Realm-Rolle besitzt (d.h. app-admin). Normale Mitglieder bekommen 403.

Gewuenschtes Verhalten (OR-Logik):

  • edit-group-Admin darf immer -> edit-group-Rolle im JWT
  • Mitglied darf die Gruppe umbenennen und andere Mitglieder entfernen -> approved GroupMember
Endpunkt Methode Aktuell Neu
/api/v1/groups/{group_id} PUT requireCompositeRole('edit-group') requireCompositeRoleOrGroupMember('edit-group', 'group_id')
/api/v1/groups/{group_id} DELETE requireCompositeRole('edit-group') requireCompositeRoleOrLastMember('edit-group', 'group_id')
/api/v1/groups/{group_id}/members/{person_id} DELETE requireOwnDataOrCompositeRole('edit-group', 'person_id') requireOwnDataOrCompositeRoleOrGroupMember('edit-group', 'person_id')

Zusaetzlich: Nach erfolgreichem DELETE member wird createdBy auf request.user.personId gesetzt, wenn die entfernte Person der Ersteller war.

Neue Auth-Hooks

Hook Logik
requireCompositeRoleOrGroupMember(permission, groupIdParam) edit-group-Rolle OR approved GroupMember
requireCompositeRoleOrLastMember(permission, groupIdParam) edit-group-Rolle OR (approved Member AND count=1)
requireOwnDataOrCompositeRoleOrGroupMember(permission, personIdParam) Self OR edit-group-Rolle OR any GroupMember

Aufgaben

  • Backend: 3 neue auth-Hooks in auth.ts
  • Backend: Hooks in groups.ts austauschen
  • Backend: createdBy-Reassignment nach Member-Removal
  • Backend: Unit-Tests in auth.test.ts + groups.test.ts
  • Backend: docs/design/03-autorisierungsmatrix.md aktualisieren
  • Frontend: groups/[groupId] — Loeschen-Button nur bei edit-group ODER members.length === 1
  • Frontend: groups/[groupId] — ActionMenu conditional (optional, alle Mitglieder duerfen entfernen)
  • Frontend: groups/+page — Edit/Delete-Buttons nur bei edit-group
  • E2E: group-permissions.spec.ts — rename + delete-visibility Tests
  • Alle Tests + Lint passieren

Akzeptanzkriterien

  • Mitglied ohne edit-group kann Gruppe umbenennen (PUT 200)
  • Mitglied ohne edit-group kann anderes Mitglied entfernen (DELETE member 204)
  • Mitglied ohne edit-group kann Gruppe mit 2+ Mitgliedern NICHT loeschen (DELETE 403)
  • Letztes Mitglied kann Gruppe loeschen (DELETE 204)
  • app-admin kann weiterhin alle Aktionen ausfuehren
  • Frontend-Buttons sind entsprechend ausgeblendet
  • E2E-Tests passieren
## Beschreibung Ein Mitglied eines Haushalts (Gruppe) kann aktuell nur Aktionen ausfuehren, wenn es die `edit-group`-Realm-Rolle besitzt (d.h. `app-admin`). Normale Mitglieder bekommen 403. Gewuenschtes Verhalten (OR-Logik): - **edit-group-Admin** darf immer -> `edit-group`-Rolle im JWT - **Mitglied** darf die Gruppe umbenennen und andere Mitglieder entfernen -> approved GroupMember | Endpunkt | Methode | Aktuell | Neu | |----------|--------|---------|-----| | `/api/v1/groups/{group_id}` | PUT | `requireCompositeRole('edit-group')` | `requireCompositeRoleOrGroupMember('edit-group', 'group_id')` | | `/api/v1/groups/{group_id}` | DELETE | `requireCompositeRole('edit-group')` | `requireCompositeRoleOrLastMember('edit-group', 'group_id')` | | `/api/v1/groups/{group_id}/members/{person_id}` | DELETE | `requireOwnDataOrCompositeRole('edit-group', 'person_id')` | `requireOwnDataOrCompositeRoleOrGroupMember('edit-group', 'person_id')` | Zusaetzlich: Nach erfolgreichem DELETE member wird `createdBy` auf `request.user.personId` gesetzt, wenn die entfernte Person der Ersteller war. ### Neue Auth-Hooks | Hook | Logik | |------|-------| | `requireCompositeRoleOrGroupMember(permission, groupIdParam)` | `edit-group`-Rolle **OR** approved GroupMember | | `requireCompositeRoleOrLastMember(permission, groupIdParam)` | `edit-group`-Rolle **OR** (approved Member **AND** count=1) | | `requireOwnDataOrCompositeRoleOrGroupMember(permission, personIdParam)` | Self **OR** `edit-group`-Rolle **OR** any GroupMember | ### Aufgaben - [ ] Backend: 3 neue auth-Hooks in `auth.ts` - [ ] Backend: Hooks in `groups.ts` austauschen - [ ] Backend: `createdBy`-Reassignment nach Member-Removal - [ ] Backend: Unit-Tests in `auth.test.ts` + `groups.test.ts` - [ ] Backend: `docs/design/03-autorisierungsmatrix.md` aktualisieren - [ ] Frontend: groups/[groupId] — Loeschen-Button nur bei `edit-group` ODER `members.length === 1` - [ ] Frontend: groups/[groupId] — ActionMenu conditional (optional, alle Mitglieder duerfen entfernen) - [ ] Frontend: groups/+page — Edit/Delete-Buttons nur bei `edit-group` - [ ] E2E: `group-permissions.spec.ts` — rename + delete-visibility Tests - [ ] Alle Tests + Lint passieren ## Akzeptanzkriterien - [ ] Mitglied ohne `edit-group` kann Gruppe umbenennen (PUT 200) - [ ] Mitglied ohne `edit-group` kann anderes Mitglied entfernen (DELETE member 204) - [ ] Mitglied ohne `edit-group` kann Gruppe mit 2+ Mitgliedern NICHT loeschen (DELETE 403) - [ ] Letztes Mitglied kann Gruppe loeschen (DELETE 204) - [ ] `app-admin` kann weiterhin alle Aktionen ausfuehren - [ ] Frontend-Buttons sind entsprechend ausgeblendet - [ ] E2E-Tests passieren
niboer self-assigned this 2026-07-05 13:00:22 +00:00
Sign in to join this conversation.
No description provided.