Drei Rollen: Administrator, Techniker, Kunde. Jede der 28 Aktionen nennt das Recht, das sie verlangt; die Rechte stehen an einer Stelle. Kundenkonten haengen an genau einem Kunden und sehen nur dessen Hosts und Rechnungen - ohne Einkaufspreise und Marge. Die Einschraenkung sitzt in den Abfragen selbst, damit keine Seite vergessen kann, sie weiterzugeben; sechs Tests pruefen das. Dabei gefunden: Neu ueber OIDC angelegte Konten haetten die Vorgabe des Datenmodells geerbt - ADMIN. Jetzt gibt es dafuer eine Einstellung mit der Vorgabe Techniker. Passkeys (#028) als gleichwertiger, passwortloser Anmeldeweg neben Passwort und OIDC. Mehrere je Konto, Aufgabe in einem kurzlebigen Cookie, rpID aus der oeffentlichen Adresse. Ohne HTTPS sagt die Seite es, statt still zu scheitern. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
38 lines
1.5 KiB
TypeScript
38 lines
1.5 KiB
TypeScript
import type { Rolle } from "@/generated/prisma/enums";
|
||
|
||
/**
|
||
* Wer darf was (#027).
|
||
*
|
||
* Die Rechte stehen bewusst als Liste an einer Stelle – nicht verteilt über Seiten und Aktionen.
|
||
* Wer eine neue Aktion baut, sucht sich hier das passende Recht und prüft es, statt Rollen
|
||
* einzeln abzufragen. Ein Recht kommt so nie versehentlich doppelt und unterschiedlich vor.
|
||
*/
|
||
export const RECHTE = {
|
||
/** Hosts, Kunden, Laufzeiten, Rechnungen anlegen und ändern. */
|
||
fachlichSchreiben: ["ADMIN", "TECHNIKER"],
|
||
/** Notizen an einem Host und Quittieren einer Warnung – auch für Kunden. */
|
||
mitarbeiten: ["ADMIN", "TECHNIKER", "KUNDE"],
|
||
/** Agent-Tokens, Benachrichtigungen, Warnregeln. */
|
||
betrieb: ["ADMIN", "TECHNIKER"],
|
||
/** Systemeinstellungen, Benutzerverwaltung, Protokoll. */
|
||
verwaltung: ["ADMIN"],
|
||
} as const satisfies Record<string, readonly Rolle[]>;
|
||
|
||
export type Recht = keyof typeof RECHTE;
|
||
|
||
export function darf(rolle: Rolle, recht: Recht): boolean {
|
||
return (RECHTE[recht] as readonly Rolle[]).includes(rolle);
|
||
}
|
||
|
||
export const ROLLEN_TEXT: Record<Rolle, string> = {
|
||
ADMIN: "Administrator",
|
||
TECHNIKER: "Techniker",
|
||
KUNDE: "Kunde",
|
||
};
|
||
|
||
export const ROLLEN_BESCHREIBUNG: Record<Rolle, string> = {
|
||
ADMIN: "Darf alles, einschließlich Benutzerverwaltung und Systemeinstellungen.",
|
||
TECHNIKER: "Darf alles Fachliche: Hosts, Kunden, Rechnungen, Tokens, Warnregeln – aber keine Benutzer anlegen.",
|
||
KUNDE: "Sieht nur die eigenen Hosts und Rechnungen, ohne Einkaufspreise. Darf Notizen schreiben und Warnungen quittieren.",
|
||
};
|