Files
trainingstagebuch/PERMISSIONS_GUIDE.md
Torsten Schulz (local) 5357dac9e1
All checks were successful
Deploy tt-tagebuch / deploy (push) Successful in 54s
chore: update file permissions for multiple files and add migration for club fee rules
- Changed file permissions from 644 to 755 for various files in the mobile-app and mobile-app_legacy_rn_expo directories, ensuring executable permissions where necessary.
- Added a new SQL migration script to the backend to introduce missing columns for club billing and invoice settings in the clubs table, maintaining synchronization with the current Sequelize model.
2026-07-17 11:51:24 +02:00

6.4 KiB
Executable File

Berechtigungssystem - Dokumentation

Übersicht

Das Trainingstagebuch verfügt nun über ein vollständiges rollenbasiertes Berechtigungssystem (RBAC - Role-Based Access Control). Der Club-Ersteller hat automatisch Admin-Rechte und kann anderen Mitgliedern Rollen und spezifische Berechtigungen zuweisen.

Rollen

1. Administrator (admin)

  • Vollzugriff auf alle Funktionen
  • Kann Berechtigungen anderer Benutzer verwalten
  • Der Club-Ersteller ist automatisch Administrator und kann nicht degradiert werden

2. Trainer (trainer)

  • Kann Trainingseinheiten planen und verwalten
  • Kann Mitglieder anlegen und bearbeiten
  • Kann Spielpläne einsehen und bearbeiten
  • Kann Turniere organisieren
  • Kann nicht: Einstellungen ändern, Berechtigungen verwalten

3. Mannschaftsführer (team_manager)

  • Kann Teams und Spielpläne verwalten
  • Kann Spieler für Matches einteilen
  • Kann Spielergebnisse eintragen
  • Kann nicht: Trainingseinheiten planen, Mitglieder verwalten

4. Mitglied (member)

  • Nur Lesezugriff auf alle Bereiche
  • Kann eigene Daten einsehen
  • Kann nicht: Daten ändern oder löschen

Berechtigungsbereiche

  • diary: Trainingstagebuch
  • members: Mitgliederverwaltung
  • teams: Team-Management
  • schedule: Spielpläne
  • tournaments: Turniere
  • statistics: Statistiken
  • settings: Einstellungen
  • permissions: Berechtigungsverwaltung
  • mytischtennis: MyTischtennis-Integration (für alle zugänglich)

Backend-Integration

Migration ausführen

mysql -u username -p database_name < backend/migrations/add_permissions_to_user_club.sql

Authorization Middleware verwenden

import { authorize, requireAdmin, requireOwner } from '../middleware/authorizationMiddleware.js';

// Beispiel: Nur Lesezugriff erforderlich
router.get('/diary/:clubId', authenticate, authorize('diary', 'read'), getDiary);

// Beispiel: Schreibzugriff erforderlich
router.post('/diary/:clubId', authenticate, authorize('diary', 'write'), createDiary);

// Beispiel: Admin-Rechte erforderlich
router.put('/settings/:clubId', authenticate, requireAdmin(), updateSettings);

// Beispiel: Nur Owner
router.delete('/club/:clubId', authenticate, requireOwner(), deleteClub);

Permission Service verwenden

import permissionService from '../services/permissionService.js';

// Berechtigungen prüfen
const hasPermission = await permissionService.hasPermission(userId, clubId, 'diary', 'write');

// Rolle setzen
await permissionService.setUserRole(userId, clubId, 'trainer', adminUserId);

// Custom Permissions setzen
await permissionService.setCustomPermissions(
  userId, 
  clubId, 
  { diary: { write: false }, members: { write: true } },
  adminUserId
);

Frontend-Integration

Composable verwenden

<script setup>
import { usePermissions } from '@/composables/usePermissions.js';

const { can, canWrite, canDelete, isAdmin, isOwner, userRole } = usePermissions();

// Beispiel
if (can('diary', 'write')) {
  // Zeige Bearbeitungsbutton
}
</script>

Direktiven verwenden

<template>
  <!-- Nur anzeigen, wenn Schreibrechte für diary vorhanden -->
  <button v-can:diary.write>Bearbeiten</button>
  
  <!-- Nur anzeigen, wenn Löschrechte für members vorhanden -->
  <button v-can:members.delete>Löschen</button>
  
  <!-- Alternative Syntax -->
  <div v-can="'diary.write'">Inhalt nur für Berechtigte</div>
  
  <!-- Nur für Admins -->
  <div v-admin>Admin-Bereich</div>
  
  <!-- Nur für Owner -->
  <div v-owner>Owner-Bereich</div>
</template>

Store verwenden

import { useStore } from 'vuex';

const store = useStore();

// Berechtigungen abrufen
const permissions = store.getters.currentPermissions;
const hasPermission = store.getters.hasPermission('diary', 'write');
const isOwner = store.getters.isClubOwner;
const userRole = store.getters.userRole;

// Berechtigungen laden (wird automatisch beim Club-Wechsel gemacht)
await store.dispatch('loadPermissions', clubId);

Admin-UI

Die Berechtigungsverwaltung ist unter /permissions verfügbar und nur für Administratoren sichtbar.

Funktionen:

  • Übersicht aller Clubmitglieder mit ihren Rollen
  • Rollen zuweisen/ändern
  • Custom Permissions für einzelne Benutzer definieren
  • Erklärung der verfügbaren Rollen

MyTischtennis-Integration

Die MyTischtennis-Einstellungen und -Funktionen sind für alle Club-Mitglieder zugänglich, unabhängig von ihrer Rolle. Dies ermöglicht es jedem, die Anbindung einzurichten und Daten abzurufen.

Sicherheitshinweise

  1. Der Club-Ersteller (Owner) kann nicht degradiert oder gelöscht werden
  2. Owner-Rechte können nicht übertragen werden
  3. Backend-Validierung wird immer durchgeführt, auch wenn das Frontend Elemente ausblendet
  4. Alle API-Routen sind durch Middleware geschützt
  5. Permissions werden gecacht im localStorage für bessere Performance

Beispiel-Szenarien

Szenario 1: Trainer hinzufügen

  1. Admin öffnet /permissions
  2. Wählt Benutzer aus
  3. Ändert Rolle zu "Trainer"
  4. Benutzer kann jetzt Trainingseinheiten planen

Szenario 2: Custom Permissions

  1. Admin öffnet /permissions
  2. Wählt Benutzer aus
  3. Klickt auf "Anpassen"
  4. Setzt individuelle Berechtigungen (z.B. nur Diary-Schreibrecht)
  5. Speichert

Szenario 3: Neues Mitglied

  1. Mitglied registriert sich und fordert Zugang an
  2. Admin genehmigt Anfrage (Standardrolle: "member")
  3. Mitglied hat Lesezugriff
  4. Bei Bedarf kann Admin die Rolle später ändern

Troubleshooting

Problem: Berechtigungen werden nicht aktualisiert

  • Lösung: Seite neu laden oder Club neu auswählen

Problem: "Keine Berechtigung" trotz korrekter Rolle

  • Lösung: Prüfen, ob Custom Permissions die Rolle überschreiben

Problem: Owner kann keine Änderungen vornehmen

  • Lösung: Owner sollte automatisch alle Rechte haben. Prüfen Sie die isOwner-Flag in der Datenbank

API-Endpunkte

GET    /api/permissions/:clubId                          - Eigene Berechtigungen abrufen
GET    /api/permissions/:clubId/members                  - Alle Mitglieder mit Berechtigungen (Admin)
PUT    /api/permissions/:clubId/user/:userId/role        - Rolle ändern (Admin)
PUT    /api/permissions/:clubId/user/:userId/permissions - Custom Permissions setzen (Admin)
GET    /api/permissions/roles/available                  - Verfügbare Rollen abrufen
GET    /api/permissions/structure/all                    - Berechtigungsstruktur abrufen