Phase B1: Anmeldung, Benutzer, Gruppen und Rollen
Umschaltbar ueber AUTH_ENABLED in der .env. Steht sie auf false, verhaelt
sich alles wie bisher - geprueft mit den 200 bestehenden Pruefungen.
Kern ist eine Actor- und Policy-Schicht: getActor() liefert bei
ausgeschalteter Anmeldung einen system-Actor mit Vollzugriff, sonst den
angemeldeten Benutzer. Dadurch braucht keine einzige Route ein
'if (anmeldungAktiv)' - sie fragen alle nur can() bzw. requirePermission().
- Datenmodell: User, Session, Group, Membership; Codes bekommen Gruppe und
Ersteller. Die Migration legt eine Standardgruppe an und ordnet ihr
bestehende Codes zu, bevor die Spalte verpflichtend wird - sonst
scheiterte sie auf jeder bereits benutzten Installation.
- Passwoerter mit scrypt aus der Node-Standardbibliothek. Bewusst kein
Argon2: das braeuchte ein natives Modul passend zur Container-Plattform.
- Sitzungen in der Datenbank, im Cookie nur ein Zufallstoken; gespeichert
wird dessen SHA-256. Deaktivieren oder ein neues Passwort beendet alle
offenen Sitzungen sofort.
- Aussperrschutz: der letzte aktive Administrator kann sich nicht selbst
entmachten, deaktivieren oder loeschen. Der Schalter liegt in der .env,
nicht in der Oberflaeche - so bleibt der Weg zurueck immer offen.
- Ersteinrichtung legt den ersten Administrator an und schliesst sich danach.
- Die Weiterleitung /r/{slug} bleibt oeffentlich, sonst liesse sich kein
gedruckter Code mehr scannen.
Zwei Fehler dabei gefunden und behoben:
- 'return handleLogin(...)' innerhalb eines try-Blocks gibt das Promise
zurueck, bevor es sich aufloest. Die Ablehnung kam nie im catch an und
wurde zu einem nackten 500er statt einer 401. Jetzt mit await.
- Die Fehlerklassen wurden ueber instanceof erkannt. type-module.ts landet
aber sowohl im Server- als auch im Client-Buendel, es gibt also zwei
Klassenidentitaeten - saubere 400er wurden dadurch still zu 500ern. Die
Erkennung laeuft jetzt ueber eine Eigenschaft.
Geprueft: 51 neue Pruefungen fuer Anmeldung und die vollstaendige
Rollenmatrix, dazu die 200 bestehenden bei ausgeschalteter Anmeldung.
This commit is contained in:
@@ -17,6 +17,7 @@ ausblenden.
|
||||
- [Aktualisieren](#aktualisieren)
|
||||
- [Konfiguration](#konfiguration)
|
||||
- [Bedienung](#bedienung)
|
||||
- [Anmeldung, Gruppen und Rollen](#anmeldung-gruppen-und-rollen)
|
||||
- [Technischer Aufbau](#technischer-aufbau)
|
||||
- [Entwicklung ohne Docker](#entwicklung-ohne-docker)
|
||||
- [API](#api)
|
||||
@@ -301,6 +302,7 @@ Alle Einstellungen stehen in der `.env` im Projektverzeichnis (Vorlage:
|
||||
| ------------------- | ------------------------------------------------------------- | ------------------------ |
|
||||
| `BASE_URL` | Öffentliche Adresse der App — landet in dynamischen QR-Codes | `http://localhost:3000` |
|
||||
| `APP_PORT` | Host-Port, auf dem die App veröffentlicht wird | `3000` |
|
||||
| `AUTH_ENABLED` | Anmeldung mit Benutzern, Gruppen und Rollen | `false` |
|
||||
| `DATABASE_URL` | Verbindungsstring der App zur Datenbank | — |
|
||||
| `POSTGRES_USER` | Datenbankbenutzer | `qrcode` |
|
||||
| `POSTGRES_PASSWORD` | Datenbankpasswort (**muss gesetzt sein**) | — |
|
||||
@@ -452,6 +454,85 @@ Statische Codes erscheinen hier nicht, weil sie nicht gespeichert werden.
|
||||
|
||||
---
|
||||
|
||||
## Anmeldung, Gruppen und Rollen
|
||||
|
||||
Standardmäßig ist die Anmeldung **aus**: wer die Anwendung erreicht, darf
|
||||
alles. Für den Einzelplatz- oder LAN-Betrieb ist das gewollt. Sobald mehrere
|
||||
Leute damit arbeiten, lässt sie sich einschalten.
|
||||
|
||||
### Einschalten
|
||||
|
||||
In der `.env`:
|
||||
|
||||
```bash
|
||||
AUTH_ENABLED=true
|
||||
```
|
||||
|
||||
Danach `docker compose up -d`. Beim nächsten Aufruf erscheint die
|
||||
**Ersteinrichtung** und du legst den ersten Administrator an. Diese Seite
|
||||
schließt sich, sobald es einen Benutzer gibt — danach führt sie zur normalen
|
||||
Anmeldung.
|
||||
|
||||
> **Aussperren ist nicht möglich.** Der Schalter steht bewusst in der `.env`
|
||||
> und nicht in der Oberfläche. Wer den Zugang verliert, setzt
|
||||
> `AUTH_ENABLED=false`, startet neu und kommt wieder an alles heran.
|
||||
|
||||
Bestehende Codes gehen dabei nicht verloren: die Migration legt eine Gruppe
|
||||
**Standard** an und ordnet ihnen diese zu.
|
||||
|
||||
### Die vier Ebenen
|
||||
|
||||
| Ebene | Darf |
|
||||
| --- | --- |
|
||||
| **Instanz-Administrator** | alles: Benutzer, Gruppen, QR-Typen und sämtliche Codes |
|
||||
| **Administrator** einer Gruppe | alles in seiner Gruppe, einschließlich Mitglieder und Rollen |
|
||||
| **Bearbeiter** | Codes der Gruppe anlegen, ändern, löschen |
|
||||
| **Betrachter** | Codes der Gruppe ansehen und herunterladen — sonst nichts |
|
||||
|
||||
Ein Benutzer kann in mehreren Gruppen sein, mit unterschiedlicher Rolle je
|
||||
Gruppe. Er sieht ausschließlich die Codes der Gruppen, in denen er Mitglied
|
||||
ist.
|
||||
|
||||
| Aktion | Betrachter | Bearbeiter | Admin der Gruppe | Instanz-Admin |
|
||||
| --- | :-: | :-: | :-: | :-: |
|
||||
| Codes sehen, Bilder herunterladen | ✓ | ✓ | ✓ | ✓ |
|
||||
| Statische Codes erzeugen | ✓ | ✓ | ✓ | ✓ |
|
||||
| Dynamische Codes anlegen und ändern | – | ✓ | ✓ | ✓ |
|
||||
| Codes löschen | – | ✓ | ✓ | ✓ |
|
||||
| Mitglieder und Rollen der Gruppe | – | – | ✓ | ✓ |
|
||||
| Gruppen und Benutzer anlegen | – | – | – | ✓ |
|
||||
| QR-Typen freigeben | – | – | – | ✓ |
|
||||
|
||||
### Was unabhängig von der Anmeldung bleibt
|
||||
|
||||
Die Weiterleitung unter `/r/{slug}` ist **immer öffentlich** — sonst könnte
|
||||
niemand einen gedruckten Code scannen. Sie verrät nur das Ziel, nicht die
|
||||
Verwaltung.
|
||||
|
||||
### Benutzer verwalten
|
||||
|
||||
Unter **Verwaltung → Benutzer**: Konten anlegen, Passwörter setzen, Konten
|
||||
deaktivieren oder löschen.
|
||||
|
||||
- Passwörter werden mit **scrypt** gespeichert (Node-Standardbibliothek, kein
|
||||
natives Modul — dadurch keine Abhängigkeit, die zur Container-Plattform
|
||||
passen muss).
|
||||
- Ein neues Passwort oder das Deaktivieren beendet **alle offenen Sitzungen**
|
||||
des Betroffenen sofort.
|
||||
- Nach acht Fehlversuchen ist ein Konto 15 Minuten gesperrt; ein Administrator
|
||||
kann die Sperre vorzeitig aufheben.
|
||||
- Der **letzte aktive Administrator** kann sich weder selbst deaktivieren noch
|
||||
sich die Rechte entziehen noch gelöscht werden.
|
||||
- Passwörter kann nur ein Administrator setzen. Einen Versand per E-Mail gibt
|
||||
es bewusst nicht — das spart einen SMTP-Zugang.
|
||||
|
||||
### Gruppen verwalten
|
||||
|
||||
Unter **Verwaltung → Gruppen**: Gruppen anlegen und Mitglieder mit Rollen
|
||||
zuweisen. Eine Gruppe, die noch Codes enthält, lässt sich nicht löschen —
|
||||
sonst führten gedruckte Codes ins Leere.
|
||||
|
||||
---
|
||||
## Technischer Aufbau
|
||||
|
||||
### Stack
|
||||
|
||||
Reference in New Issue
Block a user