Es gibt mehrere Möglichkeiten, wie ein Benutzer angemeldet werden kann, und es ist schwierig, Bedingungen über ein Plugin hinzuzufügen, die ein Benutzer vor der Anmeldung erfüllen muss.
Einige Beispiele für Bedingungen, die ein Plugin-Autor zur Authentifizierung hinzufügen möchte:
- Sicherstellen, dass die E-Mail-Domain des Benutzers einem bestimmten Muster entspricht, z. B. university.edu
- Bestätigung des zweiten Faktors von einem 2FA-Anbieter (es gibt scheinbar einige davon)
- Sicherstellen, dass der Benutzer ein aktives Abonnement über einen Zahlungsanbieter hat
Aktuelle Bedingungen werden je nach Kontext unterschiedlich geprüft (oder nicht geprüft) (nicht erschöpfende Liste):
-
- über die
create-Methode: korrektes Passwort, Benutzer genehmigt, Benutzer aktiv, E-Mail des Benutzers bestätigt, TOTP-Zweiter-Faktor, Benutzer gesperrt, korrekte/falsche IP-Adresse - über die
email_login-Methode: TOTP-Zweiter-Faktor, Benutzer genehmigt, Benutzer gesperrt, korrekte/falsche IP-Adresse
- über die
-
- über
logon_after_password_reset: Benutzer genehmigt (beachten Sie, dass dies mit einer neuenGuardian-Instanz geprüft wird), Benutzer ist Mitarbeiter
- über
-
- über
perform_accept_invitation: Benutzer aktiv
- über
Eine Möglichkeit, eine benutzerdefinierte Bedingung einzufügen, besteht darin, ein benutzerdefiniertes Modul voranzustellen, das jede Methode modifiziert. Dies ist jedoch aus Sicht der Kompatibilität mit Discourse nicht wünschenswert und auch recht unübersichtlich.
Vorschlag
Es wäre einfacher, die Authentifizierung zu erweitern, wenn sie weniger stark im gesamten Code verteilt wäre. Alle Bedingungen (und Fehlermeldungen als Reaktion darauf), die man prüfen möchte, könnten als separate Methoden an einer einzigen Stelle definiert werden. Ein Benutzer, der sich anmelden möchte, müsste jede aktivierte Bedingung bestehen. Als Plugin-Autor könnten Sie eigene Methoden zu dieser Klasse hinzufügen, die dann von der log_on_user-Methode geprüft werden. Wenn Sie eine Bedingung in einem bestimmten Kontext überspringen möchten, könnten Sie einen Parameter übergeben, um dies zu ermöglichen.