Darstellung
Navigation
Mobiles Menü
Darstellung
Navigation
Mobiles Menü
Temporärer Gastzugang mit dem b4um Generator

Temporärer Gastzugang mit dem b4um Generator

In diesem Tutorial richten wir einen temporären Gastzugang ein, melden einen Gast automatisch an, schauen uns die zeitliche Begrenzung des Kontos an und wandeln den Gast anschließend in einen normalen Benutzer um.
In den vorherigen Tutorials haben wir zunächst eine Benutzeranmeldung mit bcrypt eingerichtet und anschließend unsere Anwendung um eine Administratorverwaltung erweitert.

Doch nicht jeder Besucher möchte sofort ein dauerhaftes Benutzerkonto anlegen.

Manchmal soll ein Benutzer eine Anwendung zunächst ausprobieren können, ohne direkt ein Passwort festlegen zu müssen. Später kann er sich entscheiden, sein Gastkonto in ein reguläres Benutzerkonto umzuwandeln.

Genau dafür bietet der b4um Generator 0.4.2 den Guest-Generator.

In diesem Tutorial richten wir einen temporären Gastzugang ein, melden einen Gast automatisch an, schauen uns die zeitliche Begrenzung des Kontos an und wandeln den Gast anschließend in einen normalen Benutzer um.

Voraussetzungen

Dieses Tutorial baut auf unserer bestehenden Authentication auf.
Wir haben bereits ein User-Modell mit bcrypt:
has_secure_password
und unsere Authentication wurde mit:
bin/rails generate b4um:authentication User
eingerichtet.
Login, Logout und current_user funktionieren also bereits.
Die Administratorverwaltung aus dem vorherigen Tutorial ist für Guest nicht zwingend notwendig. Beide Generatoren können jedoch gemeinsam verwendet werden.

Guest-Generator

Der Guest-Generator wird mit unserem Authentifizierungsmodell aufgerufen.
Zusätzlich müssen wir angeben, welche Felder ein Gast beim Anlegen seines temporären Kontos ausfüllen muss.
Für unseren User verwenden wir Name und E-Mail-Adresse:
bin/rails generate b4um:guest User \
  --required=name,email
--required bestimmt also die Daten, die wir bereits von einem Gast benötigen.
Ein Passwort muss der Gast an dieser Stelle noch nicht selbst festlegen.
Guest-Generator im Terminal

Ablaufzeit eines Gastkontos

Standardmäßig ist ein Gastkonto 7 Tage gültig.
Der Generator unterstützt dafür die Option:
--expires-in
Wenn wir beispielsweise nur drei Tage erlauben möchten, könnten wir Guest so erzeugen:
bin/rails generate b4um:guest User \
  --required=name,email \
  --expires-in=3
Für dieses Tutorial verwenden wir jedoch den Standard von 7 Tagen.
Dadurch wird beim Erstellen eines Gasts ein Ablaufzeitpunkt festgelegt.
Sinngemäß:
guest_expires_at = 7.days.from_now
Damit kann unsere Anwendung später erkennen, wann ein temporäres Gastkonto abgelaufen ist.

Migration ausführen

Der Generator erweitert unser bestehendes User-Modell um zwei Datenbankfelder:
guest
guest_expires_at
guest kennzeichnet, ob es sich um ein temporäres Gastkonto handelt.
guest_expires_at enthält den Zeitpunkt, zu dem dieses Konto abläuft.
Jetzt führen wir die Migration aus:
bin/rails db:migrate
Das Boolean-Feld guest ist standardmäßig false. Unsere bereits vorhandenen normalen Benutzer werden dadurch also nicht plötzlich zu Gastbenutzern.
Guest-Migration

Einen Gast anlegen

Jetzt können wir die Gastanmeldung im Browser öffnen:
/guest
Da wir beim Generator:
--required=name,email
angegeben haben, fragt das Formular nach diesen beiden Angaben.
Der Gast muss dabei noch kein eigenes Passwort festlegen.
Gastanmeldung

Wir legen beispielsweise folgenden Gast an:
Name: Test Guest
E-Mail: guest@example.com
Nach dem Absenden erzeugt die Anwendung das Gastkonto und meldet den Benutzer unmittelbar an.
Eine separate Anmeldung über /login ist also zunächst nicht erforderlich.

Wie funktioniert ein Gast ohne eigenes Passwort?

Unser User-Modell verwendet weiterhin:
has_secure_password
Damit benötigt auch ein Gast technisch einen gültigen Passwort-Digest.
Der Guest-Generator löst das automatisch.
Beim Erstellen des Gasts wird intern ein zufälliges Passwort erzeugt.
Der Gast selbst muss dieses Passwort weder kennen noch eingeben.
Dadurch bleibt unser bestehendes bcrypt-System unverändert, während wir trotzdem einen komfortablen temporären Zugang anbieten können.
Nach erfolgreicher Erstellung wird außerdem die normale Authentication-Session gesetzt.
Der Gast ist damit sofort angemeldet.
Angemeldeter Gast


Der Gast bleibt ein normaler User-Datensatz

Ein Gast wird nicht in einer separaten Tabelle gespeichert.
Er ist weiterhin ein normaler Datensatz unseres User-Modells.
Der Unterschied besteht hauptsächlich in:
guest: true
und einem gesetzten:
guest_expires_at
Das ist wichtig für die spätere Umwandlung.
Wir müssen nämlich nicht sämtliche Daten eines Gastkontos in einen neuen Benutzer kopieren.
Stattdessen können wir denselben User-Datensatz behalten.

Hinweis auf den Ablauf des Gastzugangs

Der Generator erstellt außerdem:
app/views/shared/_guest_expiration_warning.html.erb
Damit kann die Anwendung einen angemeldeten Gast darauf hinweisen, dass sein Zugang nur vorübergehend besteht.
Der Benutzer kann dadurch rechtzeitig entscheiden, ob er sein Konto behalten möchte.
Ablaufhinweis

Gastkonto in ein normales Benutzerkonto umwandeln

Jetzt kommt eine der wichtigsten Funktionen des Guest-Generators.
Unser Gast möchte die Anwendung dauerhaft weiterverwenden.
Dafür öffnen wir:
/guest/convert
Der Gast erhält ein Formular zur Umwandlung seines Kontos.
Name und E-Mail-Adresse können übernommen bzw. angepasst werden.
Jetzt muss der Benutzer außerdem ein eigenes Passwort festlegen.
Gastkonto umwandeln

Wir tragen ein neues Passwort ein und bestätigen es.
Nach erfolgreichem Speichern wird das bestehende Gastkonto in einen normalen Benutzer umgewandelt.

Was passiert bei der Umwandlung?

Der entscheidende Punkt ist: Es wird kein neuer User erstellt.
Der bestehende Datensatz bleibt erhalten.
Aus:
guest: true
wird:
guest: false
und:
guest_expires_at
wird auf:
nil
gesetzt.
Gleichzeitig besitzt der Benutzer jetzt das von ihm selbst gewählte Passwort.
Seine bisherigen Daten und seine bestehende Identität in der Anwendung bleiben dadurch erhalten.
Das ist insbesondere dann wichtig, wenn der Gast während seiner Testphase bereits Inhalte oder andere Daten erzeugt hat.

Normaler Login nach der Umwandlung

Nach der Umwandlung ist der Benutzer kein Gast mehr.
Wir können uns abmelden und anschließend die normale Login-Seite öffnen:
/login
Jetzt verwenden wir die E-Mail-Adresse des ehemaligen Gasts und das gerade festgelegte Passwort.
Der Login funktioniert anschließend genauso wie bei jedem anderen regulären Benutzer.


Gastkonto löschen

Nicht jeder Gast möchte sein Konto behalten.
Ein Gast kann sein temporäres Konto deshalb auch löschen.
Der Guest-Generator stellt dafür die entsprechende Aktion bereit.
Beim Löschen wird nicht nur die aktuelle Session beendet, sondern der Gast-Datensatz tatsächlich entfernt.
In unserer Anwendung kann das beispielsweise über die Profilseite angeboten werden.
Gastkonto löschen

Nach der Bestätigung wird der Gast gelöscht und ist anschließend nicht mehr angemeldet.

Abgelaufene Gastkonten bereinigen

Gastkonten sind absichtlich temporär.
Deshalb erzeugt der Guest-Generator zusätzlich eine Rake-Task:
bin/rails b4um:guests:cleanup
Diese sucht nach Gastkonten, deren:
guest_expires_at
bereits überschritten wurde.
Entsprechende Gastkonten werden gelöscht.
Normale Benutzer werden davon nicht betroffen, denn die Bereinigung berücksichtigt ausschließlich Datensätze mit:
guest: true
Damit können wir beispielsweise regelmäßig abgelaufene Gastkonten aus unserer Anwendung entfernen.

Automatische Bereinigung

In einer produktiven Anwendung können wir:
bin/rails b4um:guests:cleanup
regelmäßig ausführen lassen.
Wie diese regelmäßige Ausführung eingerichtet wird, hängt vom Hosting und Deployment unserer Rails-Anwendung ab.
Der Guest-Generator stellt uns dafür bewusst die Cleanup-Task zur Verfügung; die konkrete zeitliche Planung können wir passend zu unserer Produktionsumgebung festlegen.

Guest-Routen ansehen

Wenn wir uns die erzeugten Routen ansehen möchten, können wir ausführen:
bin/rails routes | grep guest
bin/rails routes | grep guest
Wir erhalten Routen für die Gastanmeldung, das Löschen des Gastkontos und die Umwandlung.

Dazu gehören unter anderem:
GET     /guest
POST    /guest
DELETE  /guest
GET     /guest/convert
PATCH   /guest/convert
Damit deckt der Generator den vollständigen Lebenszyklus eines Gastkontos ab.

Zugriff auf die Umwandlung schützen

Die Convert-Seite ist ausschließlich für angemeldete Gäste gedacht.
Ein normaler Benutzer soll sein Konto schließlich nicht versehentlich erneut in einen anderen Zustand umwandeln.
Der GuestsController prüft deshalb, ob der aktuelle Benutzer tatsächlich ein Gast ist.
Sinngemäß:
def require_guest
  return if current_user&.guest?

  redirect_to root_path, alert: "Guest access required."
end
Auch die Gastregistrierung selbst ist nur sinnvoll, solange noch kein Benutzer angemeldet ist.
Dafür gibt es zusätzlich eine Prüfung wie:
def require_logged_out
  return unless current_user

  redirect_to root_path, alert: "You are already logged in."
end
Damit fügt sich Guest sauber in unsere vorhandene Authentication ein.


Authentication, Admin und Guest

Mit unseren drei Tutorials haben wir inzwischen eine ziemlich vollständige Grundlage für die Benutzerverwaltung aufgebaut.
Die Authentication kümmert sich um reguläre Benutzer und deren Login.
Admin erweitert diese Benutzer um Administratorrechte und eine Benutzerverwaltung.
Guest ermöglicht dagegen einen Einstieg ohne sofortige dauerhafte Registrierung.
Ein Gast kann die Anwendung ausprobieren und sich später entscheiden:
Gast
  ↓
Konto behalten
  ↓
Passwort festlegen
  ↓
Regulärer Benutzer
Der entscheidende Vorteil ist, dass bei der Umwandlung derselbe User-Datensatz erhalten bleibt.

Fazit

Mit:
bin/rails generate b4um:guest User \
  --required=name,email
erweitern wir unsere bestehende Authentication um temporäre Gastkonten.
Standardmäßig erhält ein Gast sieben Tage Zugriff. Eine andere Laufzeit können wir über --expires-in festlegen.
Der Gast benötigt bei seiner ersten Anmeldung noch kein eigenes Passwort und wird nach der Registrierung automatisch angemeldet.
Möchte er sein Konto dauerhaft behalten, kann er es anschließend über die Convert-Funktion in ein reguläres Benutzerkonto umwandeln. Dabei bleiben der bestehende User-Datensatz und damit auch die bereits vorhandenen Daten erhalten.
Nicht mehr benötigte oder abgelaufene Gastkonten können gelöscht beziehungsweise über:
bin/rails b4um:guests:cleanup
bereinigt werden.

Damit haben wir unsere kleine Reihe zur Benutzerverwaltung abgeschlossen:

Authentication → Admin → Guest

und besitzen eine solide Grundlage für Anwendungen, in denen sowohl registrierte Benutzer und Administratoren als auch temporäre Gäste unterstützt werden.
Meld dich an und schreibe ein Kommentar