# Rechtesystem Diese Anleitung beschreibt das aktuelle Rechtesystem für die Seiten unter `public/`. ## Grundidee Aktuell gilt: - `admin` und `master` haben Vollzugriff auf alle Seiten unter `public/` - normale Benutzer sehen standardmäßig keine geschützten Seiten - einzelne Seiten können pro Benutzer durch einen `master` freigegeben werden - das Header-Menü passt sich an die hinterlegten Seitenrechte an ## Rollen Es gibt zurzeit diese Rollen: - `user` Normale Benutzerrolle ohne automatischen Zugriff auf die geschützten Seiten - `admin` Vollzugriff auf alle Seiten unter `public/` - `master` Vollzugriff auf alle Seiten unter `public/` plus Verwaltung der Seitenfreigaben anderer Benutzer Die Rollen-Helfer liegen in [`public/auth_helpers.php`](../public/auth_helpers.php). ## Zentrale Logik Die zentrale Rechtebasis besteht aus drei Bausteinen: - [`public/auth_helpers.php`](../public/auth_helpers.php) Enthält Rollen-Helfer, Allowlist und die Liste der freigebbaren Seiten - [`public/header.php`](../public/header.php) Prüft beim Aufruf einer Seite den Zugriff und baut das Menü passend zu den Rechten - [`public/admin_users.php`](../public/admin_users.php) Enthält die Benutzerverwaltung und die Seitenmatrix für `master` ## Datenbank Für die Seitenfreigaben wird diese Tabelle verwendet: - `app_user_page_permissions` Wichtige Spalten: - `user_id` - `page_key` `page_key` entspricht dem relativen Seitenpfad unter `public/`, zum Beispiel: - `moonphase.php` - `tcrb_lightcurve.php` - `geocron/index.php` Wichtig: - Nicht nur der Dateiname zählt. - Unterordner-Seiten werden mit vollem relativen Pfad gespeichert. ## Öffentliche Ausnahmen Einige Seiten bleiben ohne Seitenfreigabe erreichbar. Diese stehen in der Allowlist in [`public/auth_helpers.php`](../public/auth_helpers.php): - `login.php` - `register.php` - `logout.php` ## Wie der Zugriff geprüft wird Beim Laden einer Seite mit gemeinsamem Header passiert Folgendes: 1. `header.php` ermittelt den aktuellen `page_key` 2. Wenn der Benutzer `admin` oder `master` ist, ist der Zugriff erlaubt 3. Wenn die Seite in der Allowlist steht, ist der Zugriff erlaubt 4. Sonst wird in `app_user_page_permissions` geprüft, ob der Benutzer genau diese Seite sehen darf 5. Wenn nein, kommt `403 Zugriff verweigert` Wichtig: - Eine einzelne Seitenfreigabe macht den Benutzer nicht zu `admin` - dadurch bleibt das Menü auf seine wirklich erlaubten Seiten beschränkt ## Wie das Menü funktioniert Das Header-Menü wird ebenfalls in [`public/header.php`](../public/header.php) aufgebaut. Dabei gilt: - ausgeloggte Besucher sehen nur `Anmelden` und `Registrieren` - `admin` und `master` sehen das volle Menü - normale Benutzer sehen nur die Menüpunkte, deren `href` in ihren Seitenfreigaben vorhanden ist - auch der Kontobereich unten im Menü wird entsprechend gefiltert Damit das funktioniert, müssen Menülink und `page_key` exakt zusammenpassen. Beispiel: - Menülink: `geocron/index.php` - Datenbankeintrag: `geocron/index.php` ## Wie ein Master Seiten freigibt Die Freigaben werden in [`public/admin_users.php`](../public/admin_users.php) verwaltet. Ablauf: 1. Als `master` anmelden 2. `Benutzerverwaltung` öffnen 3. Im Bereich `Seitenfreigaben` den gewünschten Benutzer wählen 4. Haken bei den erlaubten Seiten setzen 5. Speichern Besonderheiten: - `admin` und `master` brauchen keine Einzelhaken, weil ihre Rolle bereits Vollzugriff gibt - nur ein `master` darf Seitenfreigaben bearbeiten ## Wo die freigebaren Seiten definiert sind Die Liste der freigebaren Seiten steht zentral in [`public/auth_helpers.php`](../public/auth_helpers.php) in: - `manageablePublicPages()` Nur Seiten, die dort eingetragen sind, können: - in der Matrix erscheinen - einzeln für Benutzer freigegeben werden - sauber im Menü gefiltert werden ## Neue Seite ins Rechtesystem aufnehmen Wenn eine neue Seite unter `public/` dazukommt, sind in der Regel diese Schritte nötig: 1. Seite anlegen 2. Seite so bauen, dass sie den gemeinsamen Header nutzt 3. In `manageablePublicPages()` eintragen 4. Falls nötig als Menüpunkt in [`public/header.php`](../public/header.php) eintragen 5. Darauf achten, dass `href` und `page_key` exakt gleich sind Beispiel: ```php 'beispielseite.php' => 'Beispielseite', ``` Oder für Unterordner: ```php 'tools/beispiel.php' => 'Beispielseite', ``` ## Wichtige Regel für Unterordner Bei Unterordnern niemals nur `index.php` verwenden. Richtig: - `geocron/index.php` Falsch: - `index.php` Die Seitenerkennung dafür macht `currentPublicPageKey()` in [`public/auth_helpers.php`](../public/auth_helpers.php). ## Aktueller Stand Der aktuelle Zustand ist bewusst streng: - standardmäßig nur `admin` oder `master` - normale Benutzer nur über explizite Seitenfreigaben Später kann entschieden werden, welche Seiten wieder standardmäßig für normale Benutzer sichtbar sein sollen.