# Rechtesystem Diese Anleitung beschreibt das aktuelle Rechtesystem fuer die Seiten unter `public/`. ## Grundidee Aktuell gilt: - `admin` und `master` haben Vollzugriff auf alle Seiten unter `public/` - normale Benutzer sehen standardmaessig keine geschuetzten Seiten - einzelne Seiten koennen pro Benutzer durch einen `master` freigegeben werden - das Header-Menue passt sich an die hinterlegten Seitenrechte an ## Rollen Es gibt zurzeit diese Rollen: - `user` Normale Benutzerrolle ohne automatischen Zugriff auf die geschuetzten 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) Enthaelt Rollen-Helfer, Allowlist und die Liste der freigebbaren Seiten - [`public/header.php`](../public/header.php) Prueft beim Aufruf einer Seite den Zugriff und baut das Menue passend zu den Rechten - [`public/admin_users.php`](../public/admin_users.php) Enthaelt die Benutzerverwaltung und die Seitenmatrix fuer `master` ## Datenbank Fuer 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 zaehlt. - Unterordner-Seiten werden mit vollem relativen Pfad gespeichert. ## Oeffentliche 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 geprueft 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` geprueft, 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 Menue auf seine wirklich erlaubten Seiten beschraenkt ## Wie das Menue funktioniert Das Header-Menue 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 Menue - normale Benutzer sehen nur die Menuepunkte, deren `href` in ihren Seitenfreigaben vorhanden ist - auch der Kontobereich unten im Menue wird entsprechend gefiltert Damit das funktioniert, muessen Menuelink und `page_key` exakt zusammenpassen. Beispiel: - Menuelink: `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` oeffnen 3. Im Bereich `Seitenfreigaben` den gewuenschten Benutzer waehlen 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, koennen: - in der Matrix erscheinen - einzeln fuer Benutzer freigegeben werden - sauber im Menue gefiltert werden ## Neue Seite ins Rechtesystem aufnehmen Wenn eine neue Seite unter `public/` dazukommt, sind in der Regel diese Schritte noetig: 1. Seite anlegen 2. Seite so bauen, dass sie den gemeinsamen Header nutzt 3. In `manageablePublicPages()` eintragen 4. Falls noetig als Menuepunkt 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 fuer Unterordner: ```php 'tools/beispiel.php' => 'Beispielseite', ``` ## Wichtige Regel fuer Unterordner Bei Unterordnern niemals nur `index.php` verwenden. Richtig: - `geocron/index.php` Falsch: - `index.php` Die Seitenerkennung dafuer macht `currentPublicPageKey()` in [`public/auth_helpers.php`](../public/auth_helpers.php). ## Aktueller Stand Der aktuelle Zustand ist bewusst streng: - standardmaessig nur `admin` oder `master` - normale Benutzer nur ueber explizite Seitenfreigaben Spaeter kann entschieden werden, welche Seiten wieder standardmaessig fuer normale Benutzer sichtbar sein sollen.