# Berechtigungssystem - Migrations-Anleitung ## Übersicht Diese Anleitung hilft Ihnen, das neue Berechtigungssystem für bestehende Clubs einzurichten. ## Schritt 1: Datenbank-Schema erweitern Führen Sie zuerst die SQL-Migration aus, um die neuen Spalten hinzuzufügen: ```bash mysql -u username -p database_name < backend/migrations/add_permissions_to_user_club.sql ``` Dies fügt folgende Spalten zur `user_club` Tabelle hinzu: - `role` (VARCHAR) - Benutzerrolle (admin, trainer, team_manager, member) - `permissions` (JSON) - Custom Permissions - `is_owner` (BOOLEAN) - Markiert den Club-Ersteller ## Schritt 2: Bestehende Daten migrieren Sie haben zwei Optionen: ### Option A: Node.js Script (Empfohlen) Das Script identifiziert automatisch den ersten Benutzer jedes Clubs (nach `createdAt`) und setzt ihn als Owner. ```bash cd /home/torsten/Programs/trainingstagebuch/backend node scripts/migratePermissions.js ``` **Ausgabe:** ``` Starting permissions migration... Found 3 club(s) --- Club: TTC Beispiel (ID: 1) --- Members found: 5 First member (will be owner): admin@example.com ✓ Updated admin@example.com: role=admin, isOwner=true ✓ Updated user1@example.com: role=member, isOwner=false ✓ Updated user2@example.com: role=member, isOwner=false ... ✅ Migration completed successfully! Summary: Club Owners (3): - TTC Beispiel: admin@example.com - SV Teststadt: owner@test.de - TSC Demo: demo@example.com Role Distribution: - Admins: 3 - Members: 12 ``` ### Option B: SQL Script Wenn Sie lieber SQL verwenden möchten: ```bash mysql -u username -p database_name < backend/migrations/update_existing_user_club_permissions.sql ``` Dieses Script: 1. Setzt `role = 'member'` für alle genehmigten Benutzer ohne Rolle 2. Markiert den Benutzer mit der niedrigsten `user_id` pro Club als Owner ## Schritt 3: Manuelle Anpassungen (Optional) ### Falscher Owner? Falls das Script den falschen Benutzer als Owner markiert hat, können Sie dies manuell korrigieren: ```sql -- Alten Owner zurücksetzen UPDATE user_club SET is_owner = 0, role = 'member' WHERE club_id = 1 AND user_id = 123; -- Neuen Owner setzen UPDATE user_club SET is_owner = 1, role = 'admin' WHERE club_id = 1 AND user_id = 456; ``` ### Weitere Admins ernennen ```sql UPDATE user_club SET role = 'admin' WHERE club_id = 1 AND user_id = 789; ``` ### Trainer ernennen ```sql UPDATE user_club SET role = 'trainer' WHERE club_id = 1 AND user_id = 101; ``` ## Schritt 4: Verifizierung ### Backend neu starten ```bash # Server neu starten (wenn er läuft) sudo systemctl restart tt-tagebuch ``` ### Im Browser testen 1. Loggen Sie sich ein 2. Wählen Sie einen Club aus 3. Navigieren Sie zu "Berechtigungen" (nur für Admins sichtbar) 4. Überprüfen Sie, dass alle Mitglieder korrekt angezeigt werden ### SQL Verifizierung ```sql -- Alle Club-Mitglieder mit ihren Berechtigungen anzeigen SELECT c.name as club_name, u.email as user_email, uc.role, uc.is_owner, uc.approved FROM user_club uc JOIN club c ON c.id = uc.club_id JOIN user u ON u.id = uc.user_id WHERE uc.approved = 1 ORDER BY c.name, uc.is_owner DESC, uc.role, u.email; ``` ## Troubleshooting ### Problem: "Keine Berechtigung" trotz Owner-Status **Lösung:** Überprüfen Sie in der Datenbank: ```sql SELECT role, is_owner, approved FROM user_club WHERE user_id = YOUR_USER_ID AND club_id = YOUR_CLUB_ID; ``` Sollte sein: `role='admin'`, `is_owner=1`, `approved=1` ### Problem: Owner kann nicht geändert werden Das ist korrekt! Der Owner (Club-Ersteller) kann seine eigenen Rechte nicht verlieren. Dies ist eine Sicherheitsmaßnahme. ### Problem: Berechtigungen werden nicht geladen **Lösung:** 1. Browser-Cache leeren 2. LocalStorage leeren: `localStorage.clear()` in der Browser-Console 3. Neu einloggen ### Problem: "Lade Mitglieder..." bleibt hängen **Mögliche Ursachen:** 1. Migration noch nicht ausgeführt 2. Backend nicht neu gestartet 3. Frontend nicht neu gebaut **Lösung:** ```bash # Backend cd /home/torsten/Programs/trainingstagebuch/backend node scripts/migratePermissions.js # Frontend cd /home/torsten/Programs/trainingstagebuch/frontend npm run build # Server neu starten sudo systemctl restart tt-tagebuch ``` ## Nach der Migration ### Neue Clubs Bei neuen Clubs wird der Ersteller automatisch als Owner mit Admin-Rechten eingerichtet. Keine manuelle Aktion erforderlich. ### Neue Mitglieder Neue Mitglieder erhalten automatisch die Rolle "member" (Lesezugriff). Admins können die Rolle später ändern. ### Berechtigungen verwalten Admins können über die Web-UI unter `/permissions` Berechtigungen verwalten: 1. Rollen zuweisen (Admin, Trainer, Mannschaftsführer, Mitglied) 2. Custom Permissions definieren (für spezielle Anwendungsfälle) ## Wichtige Hinweise ⚠️ **Sicherung erstellen:** ```bash mysqldump -u username -p database_name > backup_before_permissions_$(date +%Y%m%d).sql ``` ⚠️ **Owner-Rechte:** - Der Owner (is_owner=1) kann nicht degradiert oder gelöscht werden - Jeder Club hat genau einen Owner - Owner-Rechte können nicht übertragen werden (nur durch direkte DB-Änderung) ⚠️ **MyTischtennis:** - MyTischtennis-Funktionen sind für ALLE Mitglieder zugänglich - Keine Berechtigungsprüfung für MyTischtennis-Endpunkte ## Rollback (falls nötig) Falls Sie das Berechtigungssystem zurücknehmen müssen: ```sql -- Spalten entfernen (Achtung: Datenverlust!) ALTER TABLE user_club DROP COLUMN role, DROP COLUMN permissions, DROP COLUMN is_owner; -- Indizes entfernen DROP INDEX idx_user_club_role ON user_club; DROP INDEX idx_user_club_owner ON user_club; ``` Dann Backend-Code auf vorherige Version zurücksetzen.