Funktionen / Ausliefern

Zugriff und Schlüssel

API-Keys mit Rolle, Collection- und Space-Scope. Nutzer mit denselben Grenzen, signierte Session-Cookies, CSRF-Prüfung per Origin, Login-Throttle. Anonym gibt es nur Veröffentlichtes.

Das Frontend soll lesen, die Redaktion schreiben, der Import-Job nur eine einzige Collection anfassen — und Entwürfe soll von außen niemand sehen. RustyCMS regelt das mit zwei Mechanismen, die dieselben Grenzen teilen: API-Keys für Maschinen, Sessions für Menschen.

Ein Schlüssel, eine Aufgabe

RUSTYCMS_API_KEYS_JSON='[
  {"key":"prod-frontend","role":"read","collections":["page","post"],"environments":["prod"]},
  {"key":"editorial","role":"read_write","collections":["page","post","tag"]},
  {"key":"ops","role":"admin"}
]'

Drei Rollen: read, read_write, admin. Dazu pro Key eine Whitelist für Collections und Spaces — weglassen heißt alle, admin umgeht beide. Der Frontend-Key kann nur lesen und nur page und post im Space prod; fällt er in fremde Hände, ist das der ganze Schaden. Übergeben wird der Key als Authorization: Bearer oder X-API-Key. Wer keine Scopes braucht, nimmt die kürzere Form RUSTYCMS_API_KEYS=alice:read_write,bob:read oder einen einzelnen RUSTYCMS_API_KEY.

Nutzer mit denselben Grenzen

Redaktionskonten tragen dieselbe Rolle und dieselben Whitelists. Die Admin-UI zeigt nur, was das Konto sehen darf: Die Sidebar listet erlaubte Collections, Listen-Endpoints filtern, jeder Schreibzugriff wird gegen Collection und Space geprüft. Auch der Batch-Endpoint prüft pro Teilanfrage — ein gebündelter Request umgeht keinen Scope. Konten, Passwort-Reset und Scopes pflegst du in den Einstellungen, ohne Konfigurationsdatei.

Sessions, die man nicht fälschen kann

POST /api/auth/login setzt ein signiertes Cookie. Der Schlüssel dafür kommt aus RUSTYCMS_SESSION_SECRET, mindestens 64 Byte, im Release-Build Pflicht. RUSTYCMS_SESSION_MAX_AGE bestimmt die Lebensdauer in Tagen; unset heißt Session-Cookie, weg beim Schließen des Browsers. RUSTYCMS_COOKIE_SECURE=true beschränkt das Cookie auf HTTPS.

Schreibt jemand mit Cookie, prüft die API den Origin-Header gegen die eigene Base-URL, die CORS-Origins und optional RUSTYCMS_CSRF_ALLOWED_ORIGINS. Eine fremde Seite kann den eingeloggten Browser nicht als Werkzeug benutzen. Key-Auth über Header ist davon ausgenommen — die schickt kein Browser von allein.

Der Login ist gedrosselt: fünf Versuche pro Minute je IP und Nutzername, danach 429. Ein Angreifer, der Nutzer durchprobiert, trifft das IP-Limit; verteiltes Credential-Stuffing trifft das Limit je Nutzername.

CORS und was Anonyme sehen

RUSTYCMS_CORS_ORIGIN nennt die erlaubte Frontend-Origin; * ist der Dev-Default. Der Header X-Total-Count wird freigegeben, damit paginierende Clients ihn cross-origin lesen können.

Ohne Key oder Session liefert die API ausschließlich Veröffentlichtes. Entwürfe und Archiviertes bleiben unsichtbar, _status=draft wird ignoriert — außer der Request trägt ein gültiges, signiertes Preview-Token.

Bewusst nicht drin

Keine Rechte pro Feld, keine Rechte pro Eintrag. Die Grenze ist die Collection und der Space. Drei Rollen und zwei Whitelisten lassen sich auf einem Bildschirm prüfen — ein Rechtebaum nicht mehr.

Willst du das an deinem Projekt sehen?

Sag kurz, was du vorhast. Ich zeige die Admin-UI an einer echten Installation und sage ehrlich, ob es passt.

Früher Zugang anfragen