Add new permission routes and integrate permission checks across various existing routes to ensure proper access control. Update the UserClub model to include role and permissions fields, allowing for more granular user access management. Enhance the frontend by introducing a user dropdown menu for managing permissions and displaying relevant options based on user roles. Improve the overall user experience by implementing permission-based visibility for navigation links and actions throughout the application.
6.4 KiB
6.4 KiB
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
- Der Club-Ersteller (Owner) kann nicht degradiert oder gelöscht werden
- Owner-Rechte können nicht übertragen werden
- Backend-Validierung wird immer durchgeführt, auch wenn das Frontend Elemente ausblendet
- Alle API-Routen sind durch Middleware geschützt
- Permissions werden gecacht im localStorage für bessere Performance
Beispiel-Szenarien
Szenario 1: Trainer hinzufügen
- Admin öffnet
/permissions - Wählt Benutzer aus
- Ändert Rolle zu "Trainer"
- Benutzer kann jetzt Trainingseinheiten planen
Szenario 2: Custom Permissions
- Admin öffnet
/permissions - Wählt Benutzer aus
- Klickt auf "Anpassen"
- Setzt individuelle Berechtigungen (z.B. nur Diary-Schreibrecht)
- Speichert
Szenario 3: Neues Mitglied
- Mitglied registriert sich und fordert Zugang an
- Admin genehmigt Anfrage (Standardrolle: "member")
- Mitglied hat Lesezugriff
- 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