# 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 ```sql mysql -u username -p database_name < backend/migrations/add_permissions_to_user_club.sql ``` ### Authorization Middleware verwenden ```javascript 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 ```javascript 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 ```vue ``` ### Direktiven verwenden ```vue ``` ### Store verwenden ```javascript 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 ```