Benutzer und Organisation
Übersicht
Mein Konto (Self-Service)
Jeder angemeldete Nutzer — unabhängig von Rolle (Tenant, Content Editor, Viewer, …) — öffnet über das Avatar-Menü:
- Mein Konto (
/dashboard/account): Anzeigename, Profilbild-URL, Passwort - Meine Benachrichtigungen (
/dashboard/account/notifications): Desktop-Push und E-Mail-Digest — auch über Glocke → Desktop-Benachrichtigungen einrichten
Details unter Mein Konto:
- Profil: Anzeigename und optional Profilbild-URL (https) selbst ändern.
- E-Mail, Rolle, Status: nur Anzeige — Änderungen nur durch Administrator (
Einstellungen → Benutzer & Rollen). - Organisation: Anzeige, wenn dem Konto eine Organisation zugeordnet ist.
- Passwort: Selbst ändern mit aktuellem Passwort; Anforderungen wie bei der System-Passwortrichtlinie.
- Passwort vergessen: Abmelden und auf der Anmeldeseite Passwort vergessen? nutzen.
- Zugewiesene Center: Anzeige der expliziten Center-Zuweisungen (org-weite Rollen sehen ggf. zusätzliche Center über die Navigation, nicht zwingend in dieser Liste).
Einstellungen im selben Menü nur für Super Admin, Center Admin, Center Manager und Org Marketing Manager — nicht für Tenant, Content Editor oder Viewer.
API (eingeloggter Nutzer): GET / PATCH /api/users/me (name, optional avatar), POST /api/users/me/change-password. Fremde Profile: GET /api/users/{id} nur für sich selbst oder Admins (Org-Scope). Aktivitäten: GET /api/users/{id}/activities mit gleicher Sichtregel.
Unter Einstellungen → Benutzer & Rollen können Administratoren neue Konten anlegen und bestehende bearbeiten. Organisations-Zuweisungen (mehrere möglich) und Center-Zuweisungen steuern den Zugriff. KAM-Zuständigkeiten steuern AgencyOS Teams-Briefings.
Organisations-Zuweisungen (mehrere möglich)
Wo: Benutzer anlegen / bearbeiten → Karte Organisations-Zuweisungen
| Feld | Bedeutung |
|---|---|
| Organisation | Mandant / Kundenorganisation |
| Rolle in der Organisation | CENTER_ADMIN oder ORG_MARKETING_MANAGER — Zugriff auf alle Center dieser Organisation |
- Ein User kann mehrere Organisationen haben (z. B. zwei Kunden-Mandanten).
- Für globale Rollen
CENTER_ADMIN/ORG_MARKETING_MANAGERist mindestens eine Organisations-Zuweisung Pflicht. - Legacy-Feld
User.organizationIdbleibt als primäre Organisation (erste Zuweisung) für die Session erhalten.
So testen: User mit zwei Org-Blöcken anlegen → beide Orgs sollten in der Center-Navigation sichtbar sein (alle Center beider Orgs).
KAM-Zuständigkeiten (Key Account Manager)
Wo: Benutzer bearbeiten → KAM-Zuständigkeiten — oder Center-Detail → Tab Team & Ansprechpartner
| Feld | Bedeutung |
|---|---|
| Shopping Center | Center, für das der User KAM ist |
| KAM-Rolle | Primärer KAM oder Vertretung (z. B. Urlaub) |
AgencyOS holt Empfänger per API kam-briefing-index (Match über E-Mail).
Welche Rollen brauchen eine Organisation?
- Center Administrator (Organisation) (
CENTER_ADMIN) - Marketing Manager (
ORG_MARKETING_MANAGER)
Ohne gewählte Organisation kann ein solcher Benutzer nicht angelegt oder gespeichert werden.
Wer darf was setzen?
- Super Admin: Kann jede Organisation aus der Liste wählen (bei mehreren Mandanten ein Dropdown).
- Center Administrator: Sieht nur die eigene Organisation; die ID wird serverseitig immer auf diese Organisation gesetzt. Eine andere Organisation kann nicht zugewiesen werden.
Center-Zuweisungen
Für org-weite Rollen sind Center-Zuweisungen optional – der Zugriff kommt primär über die Organisation. Zuweisungen können Sie trotzdem nutzen, wenn Sie später feinere Modelle einführen oder Dokumentation für Redakteure brauchen.
Für Rollen wie Tenant oder Center Manager bleiben Center-Zuweisungen relevant, damit klar ist, auf welche Center sich das Konto bezieht.
Rolle „Agentur (Content)“ (AGENCY_CONTENT_EDITOR)
| Was | Eingeschränkte Redaktionsrolle für externe Agenturen — nur Inhalte der zugewiesenen Center, ohne technische Bereiche. |
| Warum | CONTENT_EDITOR öffnet zu viel (Redaktionsfluss, Kanäle, Website-Konfiguration). Agenturen sollen News, Events, Shops usw. pflegen, aber keine Infrastruktur. |
| Wer | Externe Dienstleister; Anlage durch Center Admin / Super Admin unter Einstellungen → Benutzer & Rollen. |
| Wo | Mall Cockpit: Shops, News, Events, Angebote, Jobs, Services, Hot Picks, Medien — erstellen und bearbeiten. Social: Posts als Entwurf. |
| So testen | 1) User mit Rolle Agentur (Content) + mindestens ein Center anlegen. 2) Anmelden — Sidebar ohne Redaktionsfluss, Center-Website, Kanäle verknüpfen. 3) News/Event anlegen → Entwurf mit Freigabe-Pflicht. 4) Direkt-URL /dashboard/website → Redirect auf Dashboard. |
Sichtbar: Mall Cockpit (Shops, Events, News, …), Social (Post erstellen, Engage, Performance).
Ausgeblendet / blockiert: Redaktionsfluss (Dispatch, Workflow, Planner), Kanäle verknüpfen, Center-Website / Frontend-Kanäle / Templates, Center technisch konfigurieren (Website-Reiter im Center-Detail), RSS-Feeds, Einstellungen, Analytics, Community-Cockpit.
Center-Zuweisung: Pflicht — ohne zugewiesenes Center kein sinnvoller Zugriff.
Rollen-Reiter – Modul-Konfiguration pro Rolle
Im Tab Rollen können Super Admins pro Rolle einzelne Produktmodule per Toggle freischalten oder sperren:
- Toggle-Liste: Alle nicht-Core-Module mit aktuellem Freigabe-Status. Grüner Hintergrund = aktiv.
(Override)= manuell gesetzt (DB-Tabellerole_module_configs). - Logik: DB-Overrides haben Vorrang; fehlt ein Override, gilt der Codewert aus
ROLE_PERMISSIONS(apps/dashboard/src/lib/permissions.ts). Core-Module sind nicht sperrbar. - Sofortige Wirkung:
use-navigation.tsberücksichtigt die Overrides; die Sidebar aktualisiert sich beim nächsten Navigieren. - API:
GET /api/role-module-config– Super Admin: volle Matrix; andere Rollen (z. B. Center Admin, Org Marketing): nur die eigene Rolle (für Sidebar/Navigation, kein 403).PUT/DELETEnur Super Admin ({ role, moduleId, isEnabled }).
Drei Ebenen im Überblick
| Ebene | Wo | Effekt |
|---|---|---|
| Tenant-weit | Einstellungen → Module | Schaltet Bereiche für alle Rollen |
| Pro Rolle | Einstellungen → Benutzer → Tab „Rollen" | Override welche Module eine Rolle sehen darf |
| Pro Benutzer | Benutzer bearbeiten | Wählt die Rolle + Center-Zuweisungen |
Pro einzelnem Benutzer gibt es keinen eigenen Modul-Override-Screen (technisch via ModuleConfig.userId möglich, aber kein Standard-UI-Flow).
Bearbeiten
Beim Wechsel von einer org-weiten Rolle auf eine andere Rolle wird organizationId beim Speichern automatisch entleert. Beim Wechsel auf eine org-weite Rolle müssen Sie wieder eine Organisation wählen (bzw. es gilt die eine sichtbare Organisation).
E-Mails und Account-Einrichtung
| Was | Neue Konten und Passwort-Aktionen laufen über sichere Einmal-Links in E-Mails — kein Passwort im Klartext. Einheitliches cockpitOS-Layout; Footer: SawatzkiMühlenbruch GmbH. |
| Warum | SaaS-Standard: Postfächer, Weiterleitungen und Support-Logs sollen keine lesbaren Passwörter enthalten; Nutzer legen ihr Passwort selbst fest. |
| Wer | Admins (User anlegen, zurücksetzen, aktivieren/deaktivieren); neue Nutzer (Willkommen/Einladung); Redaktion (Social-Freigabe-Mails — siehe Social Media Freigabe). |
| Wo | Einstellungen → Benutzer & Rollen (/dashboard/settings/users); Anlegen: /dashboard/settings/users/create; öffentliche Seiten /auth/activate, /auth/reset-password, /auth/signin. |
| So testen | 1) Test-User anlegen → E-Mail mit „Account einrichten“. 2) Link öffnen → Passwort setzen → Anmeldung. 3) „Passwort zurücksetzen“ in der User-Liste → E-Mail mit 24h-Link. 4) Optional: Häkchen Als Einladung versenden beim Anlegen. |
| Betrieb | RESEND_API_KEY, NEXTAUTH_URL, optional RESEND_FROM_EMAIL / RESEND_FROM_NAME — Details: Developer: Dashboard-E-Mails. |
Neuen Benutzer anlegen
- Einstellungen → Benutzer & Rollen → Neuen Benutzer erstellen
- Name, E-Mail und Rolle ausfüllen — kein Passwort-Feld mehr im Formular.
- Nach dem Speichern erhält die Person automatisch eine E-Mail:
- Standard: Willkommens-Mail mit Link Account einrichten (7 Tage gültig); Stichpunkte passen zur Rolle (Admin, Redaktion, Center-Manager-App, Leserecht).
- Optional: Häkchen Als Einladung versenden → Einladungs-Mail mit Hinweis auf Organisation und einladende Person.
- Schlägt der Versand fehl, wird der User trotzdem angelegt — im Dashboard erscheint eine Warnung (E-Mail erneut über Admin-Reset oder Support klären).
- Der Empfänger öffnet den Link (
/auth/activate?token=…), legt ein Passwort fest und meldet sich an.
Hinweis: Das API-Feld password beim Anlegen wird ignoriert — Sicherheit liegt im Einmal-Link, nicht im Klartext.
Passwort zurücksetzen (Admin)
In der Benutzerliste: Aktion Passwort zurücksetzen.
- Es wird kein neues Passwort angezeigt oder per E-Mail im Klartext versendet.
- Die Person erhält einen Einmal-Link (24 Stunden) zum selbstständigen Festlegen des Passworts (
/auth/reset-password). - Nach erfolgreicher Änderung: Bestätigungs-Mail Passwort geändert (gilt auch für Mein Konto → Passwort ändern).
Passwort vergessen (Self-Service)
Auf der Anmeldeseite Passwort vergessen? → E-Mail mit Reset-Link (24 Stunden). Gleiche Seite wie beim Admin-Reset.
Weitere automatische Mails
| Situation | E-Mail an |
|---|---|
| Rolle geändert | Betroffener Nutzer |
| Account deaktiviert / reaktiviert | Betroffener Nutzer |
| Account gelöscht | Betroffene E-Mail-Adresse |
| Social-Post abgelehnt / Publish-Fehler | Ersteller — sofort |
| Social-Post freigegeben | Ersteller — sofort, außer Digest ist aktiv (dann in der täglichen Zusammenfassung) |
Einmal-Links (Setup, Reset, Entsperren)
| Situation | Verhalten |
|---|---|
| Link gültig | Formular (Passwort setzen / Account entsperren) |
| Abgelaufen | Klare Meldung + Hinweis auf neuen Link (24 h Reset/Unlock, 7 Tage Setup) |
| Bereits verwendet | Token wird nach erfolgreicher Aktion gelöscht — erneuter Aufruf zeigt „bereits verwendet“ |
| Falscher Link-Typ | z. B. Setup-Link auf Reset-Seite — eigene Fehlermeldung |
Technik: diagnoseAccountToken() in account-token-auth.ts; API POST /api/auth/validate-reset-token mit reason-Codes.
Account gesperrt (Login-Lockout)
Nach 5 fehlgeschlagenen Anmeldeversuchen wird der Account vorübergehend gesperrt (30 Minuten). Die Person erhält eine E-Mail mit Link Account entsperren (/auth/unlock, 24 Stunden gültig). Alternativ läuft die Zeit-Sperre von selbst ab.
Inaktive Accounts
- Einrichtungslink (
/auth/activate): funktioniert auch bei Status Inaktiv — nach Passwort-Festlegung wird der Account aktiviert. - Passwort vergessen / Admin-Reset: für alle anmeldefähigen Accounts (Status nicht Inaktiv), auch bei temporärer Login-Sperre. Bei Status Inaktiv auf der Anmeldeseite: Einrichtungslink statt Reset-Link.
Nicht per Dashboard-Mail: Login per Magic Link (nur E-Mail + Passwort). Magic Links gibt es separat für AgencyOS/WordPress.
Center-Website: Kontakt- und Vermietungsformulare nutzen eigene Templates — nicht die Dashboard-Benutzer-Mails.
Technische Referenz (alle Templates, Testskript): Developer: Dashboard-E-Mails.
Täglicher Redaktions-Digest
| Was | Optional einmal täglich eine E-Mail mit Redaktions-Updates — Benachrichtigungen aus der Glocke, offene Social-Freigaben und Workflow-Entwürfe. Nur wenn etwas ansteht; maximal einmal pro Tag. |
| Warum | Informiert ohne Spam: Standard ist aus (bewusstes Opt-in). Passwort-, Lockout- und dringende Social-Mails (Ablehnung, Publish-Fehler) bleiben sofort. |
| Wer | Redaktion, Center-Manager, Freigeber — jeder Nutzer für sich. |
| Wo | Einstellungen → Benachrichtigungen → Tab Präferenzen → Karte Tägliche E-Mail-Zusammenfassung (/dashboard/settings/notifications). |
| So testen | 1) Digest aktivieren, Stunde wählen (z. B. 08:00 Berlin). 2) Speichern. 3) Test mit pnpm test:email-digest (dry-run) oder Cron ?userId=…&dryRun=1. 4) Zur gewählten Stunde oder mit ?userId= erzwingen — Mail nur bei offenen Punkten. |
| Betrieb | GitHub Action .github/workflows/email-digest.yml (stündlich); CRON_SECRET wie andere Crons — siehe Cron-Setup. |
Org-spezifisches Dashboard (Login, Legal, Support)
| Plattform-URL | https://dashboard.cockpit-os.de — globales cockpitOS-Branding, keine Org-Anpassung auf der Login-Seite. |
| Org-URL | https://{org-slug}.dashboard.cockpit-os.de — gebrandeter Login (Logo/Farben aus Organisations-Branding), Footer mit Datenschutz/AGB/Support. |
| DNS | Render: Wildcard *.dashboard.cockpit-os.de → Service mallos-dashboard (expliziter Record, nicht *.cockpit-os.de der Center-Website). |
| Legal-Seiten | /privacy, /terms, /support auf der Org-URL: Cockpit-Look mit Navigation, weißer Inhaltskarte auf hellem Verlaufshintergrund (wie Login), Fließtext und Kontaktblöcke; Betreiber SawatzkiMühlenbruch GmbH; Technik fest Saad Badr, Technischer Leiter (technik@schickma.de); org-Overrides optional unter Legal & Support. |
| Pflege im Dashboard | Organisationen → {Org} → Reiter „Legal & Support“ — Overrides für Support-E-Mails, Telefon, SLA-Text, Datenschutz-Kontakte (dashboardLegalConfig in der DB). Leere Felder = Plattform-Default. |
| Legacy-URL | {org-slug}-dashboard.cockpit-os.de wird weiter erkannt (Abwärtskompatibilität). |
Organisations-Branding (Defaults für Center)
Wo: Organisationen → {Org} → Reiter „Branding“ (?tab=branding; ältere Links mit ?tab=theme leiten weiter).
Hier legen Sie mandantenweite Standard-Werte fest. Center ohne eigene Einstellung übernehmen sie automatisch — z. B. wenn alle Center einer Organisation dieselbe Primärfarbe nutzen und kein eigenes Logo haben.
| Feld | Wirkung |
|---|---|
| Primär-, Sekundär-, Akzentfarbe | Fallback auf der Center-Website, wenn im Center keine Farben gesetzt sind (Vererbung im Tab Design / Webseite). |
| Logo | Fallback-Logo: Center → Organisation. |
| Favicon | Fallback für Browser-Tabs. |
| Hausschrift / Schrift-URL | CSS font-family bzw. Webfont-URL — Fallback, wenn das Center keine eigene Schrift hat. |
| Dashboard-Theme-Modus | Hell/Dunkel nur für die gebrandete Org-Dashboard-Login-URL ({slug}.dashboard.cockpit-os.de). |
Upload: Logo und Favicon werden über die Bunny-Mediathek (wie im Center-Formular) hochgeladen — kein manuelles URL-Feld nötig.
Abgrenzung:
- Nicht hier: MEC-/Template-Layouts, Hero, Bento — das ist der Center-Reiter Webseite.
- Nicht mehr im Org-Tab: Block-Themes (Legacy WordPress-Plugin-System) — entfernt, da für Center-Websites irrelevant.
API: Branding liegt in Organization.branding (JSON-String). Öffentlich für Login: GET /api/organizations/{slug}/branding.
Kontakt-E-Mails (Zwei-Domain-Modell)
| Kontext | Adresse | Anzeige |
|---|---|---|
| Technik / Support (UI) | technik@schickma.de | Saad Badr, Technischer Leiter |
| Allgemein / Vertrag | kontakt@schickma.de | SawatzkiMühlenbruch GmbH |
| Redaktion | redaktion@schickma.de | Redaktion & Center-Betrieb |
| Datenschutz | datenschutz@schickma.de | Datenschutzbeauftragter |
| Demo / Vertrieb | demo@schickma.de | optional |
| System-Versand (Resend) | noreply@mail.cockpit-os.de | Absender = Produkt cockpitOS |
| Reply-To System-Mails | support@schickma.de | Alias auf Technik-Postfach |
Persönliche Adressen (sb@, nh@) nur intern (Login, Seed, Tests). Konstanten im Code: apps/dashboard/src/lib/platform-dashboard-legal.ts.
API
POST /api/users und PUT /api/users akzeptieren optional organizationId. Die Server-Logik validiert die Kombination aus Rolle und Berechtigung des aktuell eingeloggten Administrators.
Beim Anlegen:
invite: true(optional) — Einladungs-Mail statt Willkommens-Mail.- Kein Klartext-Passwort in Request oder Response.
Passwort-Reset durch Admin: POST /api/users/{userId}/reset-password mit resetBy (Name des Administrators).
Modul-Overrides: PUT /api/role-module-config (nur Super Admin).
Nutzungsstatistik: Seitenaufrufe werden anonymisiert erfasst. Im Umami-Dashboard nach diesem Pfad filtern: /dashboard/benutzer-organisation