TYPO3 Extension · Documentation

Backend User Invite

Einen neuen Backend-Benutzer anzulegen bedeutet normalerweise: Konto erstellen, ein Passwort ausdenken und dieses Passwort irgendwie an die Person schicken — per E-Mail, Chat oder Zettel.

composer
composer require digitalzombies/be-invite

Extension key:be_invite · Composer:digitalzombies/be-invite · TYPO3: 14 LTS

Einen neuen Backend-Benutzer anzulegen bedeutet normalerweise: Konto erstellen, ein Passwort ausdenken und dieses Passwort irgendwie an die Person schicken — per E-Mail, Chat oder Zettel. Das Passwort liegt damit in einem Kanal, den ihr nicht kontrolliert, und bleibt dort meistens auch.

Diese Extension ersetzt das durch eine Einladung. Die Administratorin oder der Administrator gibt eine E-Mail-Adresse ein und wählt die Benutzergruppen; die eingeladene Person erhält einen Link und wählt ihr Passwort selbst. Niemand hat je ein fremdes Passwort in der Hand.


Der Einladungs-Ablauf

1. Administrator öffnet System › Backend-Benutzer

Neben den TYPO3-eigenen Schaltflächen Redakteur anlegen / Administrator anlegen sitzt ein Button Benutzer einladen. Er wird nur für Administratoren und nur in der Benutzerliste gerendert.

Der Button „Benutzer einladen" im Modul Backend-Benutzer

2. Die Daten der eingeladenen Person eingeben

Der Dialog fragt nach einer E-Mail-Adresse, optional einem Namen und mindestens einer Backend-Benutzergruppe. Die Gruppenliste wird beim Öffnen des Dialogs vom Server geladen und zeigt damit immer die aktuell vorhandenen Gruppen.

Der Einladungsdialog mit leerem Formular

Die E-Mail-Adresse wird zum Benutzernamen des neuen Kontos — es gibt keinen separaten Benutzernamen, den man sich ausdenken und mitteilen müsste.

Der ausgefüllte Einladungsdialog

3. TYPO3 verlangt eine Bestätigung

Ein Backend-Konto anzulegen ist eine privilegierte Operation, deshalb verlangt der Sudo-Modus von TYPO3 die erneute Eingabe des eigenen Passworts. Eine unbeaufsichtigte, noch eingeloggte Session kann so niemandem Backend-Zugang verschaffen.

Die Passwortbestätigung des TYPO3-Sudo-Modus

4. Die Einladung geht raus

Bestätigung, dass die Einladung versendet wurde

Das Konto existiert jetzt, ist aktiviert und trägt die gewählten Gruppen — aber es hat kein Passwort, das irgendjemand kennt, und es wurde noch nie damit eingeloggt.

Das neue Konto in der Backend-Benutzerliste

5. Die eingeladene Person erhält die E-Mail

Die E-Mail nennt den Benutzernamen und enthält einen Aktivierungslink, der 48 Stunden gültig ist. Sie wird als HTML und als Text verschickt.

Die Einladungs-E-Mail

6. Die eingeladene Person setzt ihr eigenes Passwort

Der Link öffnet den TYPO3-eigenen Passwort-Reset — kein eigenes Formular, kein zusätzlicher Code-Pfad, und die Passwort-Richtlinie der Installation greift genauso wie überall sonst.

Der TYPO3-Passwort-Reset, geöffnet über den Einladungslink

Nach dem Setzen des Passworts kann sich die Person mit ihrer E-Mail-Adresse und dem gerade gewählten Passwort anmelden.


Was im Hintergrund passiert

SchrittWas die Extension tut
ValidierungTrimmt die E-Mail-Adresse und wandelt sie in Kleinbuchstaben, weist fehlerhafte Adressen ab, ebenso Adressen mit mehr als 50 Zeichen (die Breite von be_users.username) und Anfragen ohne Gruppe
DublettenprüfungVerweigert die Einladung, wenn E-Mail oder Benutzername bereits zu einem Konto gehören — auch zu deaktivierten und zeitlich beschränkten
KontoerstellungSchreibt den Datensatz über den DataHandler von TYPO3, mit einem langen zufälligen Platzhalter-Passwort, admin = 0, aktiviert, auf Root-Ebene
AktivierungslinkErzeugt einen Token genau so, wie der TYPO3-Core Passwort-Reset-Token erzeugt, aber mit 48 Stunden Gültigkeit statt 2 Stunden, und speichert ihn gehasht
E-MailRendert die Fluid-Templates Invitation.html / Invitation.txt und verschickt sie über den konfigurierten TYPO3-Mailer

Falls das Konto angelegt, die E-Mail aber nicht zugestellt werden konnte, wird das explizit gemeldet — das Konto existiert zu diesem Zeitpunkt bereits, und der richtige Weg ist dann ein normaler Passwort-Reset, keine zweite Einladung.

Sicherheitseigenschaften

  • Nur für Administratoren. Beide AJAX-Endpunkte prüfen serverseitig $GLOBALS['BE_USER']->isAdmin(). Den Button auszublenden ist nicht die Zugriffskontrolle — die Endpunkte sind es. Ohne diese Prüfung könnte allein der Gruppen-Endpunkt jeder Redaktion sämtliche Backend-Benutzergruppen offenlegen.
  • Sudo-Modus. Das Anlegen eines Kontos löst die Step-up-Authentifizierung von TYPO3 aus.
  • Keine Passwort-Preisgabe. Das Platzhalter-Passwort ist zufällig, wird nie angezeigt, nie geloggt und nur als Hash gespeichert.
  • Keine internen Fehlermeldungen nach außen. DataHandler-Meldungen, SQL-Fehler und Mailer-Konfiguration werden per PSR-3 geloggt und durch eine generische Meldung ersetzt, bevor sie im Browser landen.
  • Bestehende Konten werden nie stillschweigend verändert. Eine kollidierende Einladung wird mit HTTP 409 abgewiesen, und ein Datensatz, der ein Rennen gegen einen gleichzeitigen Insert verliert, wird zurückgerollt.

Eine Konsequenz ist erwähnenswert: Der Einladungslink wird über die Core-Route password_reset_validate validiert, und die berücksichtigt $GLOBALS['TYPO3_CONF_VARS']['BE']['passwordReset'] nicht. Wenn der Passwort-Reset auf dieser Installation bewusst abgeschaltet wurde, öffnet diese Extension diesen Weg für eingeladene Personen wieder.

Voraussetzungen und Installation

TYPO3 14.0–14.99 und PHP 8.2+. Die Extension nutzt die ComponentFactory aus v14, das Attribut #[AsEventListener] und den HashService aus v14 und ist nicht abwärtskompatibel zu TYPO3 13.

bash
composer require digitalzombies/be-invite

Danach die Caches leeren. Es gibt keine Datenbankänderung, kein TypoScript und nichts zu konfigurieren — ein funktionierendes Mail-Setup wird allerdings vorausgesetzt.

Die E-Mail anpassen

Die Templates sind unter MAIL/templateRootPaths[1700000000] registriert. Registriert einen eigenen Pfad mit einem höheren Schlüssel und legt dort Invitation.html / Invitation.txt ab:

php
$GLOBALS['TYPO3_CONF_VARS']['MAIL']['templateRootPaths'][1700000100]
    = 'EXT:my_sitepackage/Resources/Private/Templates/Email/';

Verfügbare Variablen: name, email, resetLink.

Die mitgelieferten Templates sind ausschließlich auf Englisch. Zum Zeitpunkt der Einladung hat die empfangende Person noch kein Backend-Konto und damit keine Spracheinstellung, deshalb wird keine Sprache automatisch ausgewählt.

Sprache der Oberfläche

Die Backend-Oberfläche gibt es auf Englisch, Deutsch und Ungarisch. Die Labels liegen in Resources/Private/Language/{locallang,de.locallang,hu.locallang}.xlf und werden von PHP-Code und JavaScript-Modul gemeinsam genutzt.