Mit dem b4um Generator 0.4.2 können wir unsere bestehende Authentication um eine Administratorverwaltung erweitern.
Im vorherigen Tutorial haben wir mit bcrypt und dem b4um:authentication-Generator eine vollständige Benutzeranmeldung eingerichtet.
Unsere Anwendung kann damit bereits zwischen angemeldeten und nicht angemeldeten Benutzern unterscheiden. In vielen Anwendungen reicht das allerdings nicht aus: Bestimmte Funktionen sollen ausschließlich Administratoren zur Verfügung stehen.
Mit dem b4um Generator 0.4.2 können wir unsere bestehende Authentication um eine Administratorverwaltung erweitern.
Der Generator ergänzt unser User-Modell um die benötigten Felder, erstellt einen geschützten Adminbereich und stellt Funktionen bereit, mit denen Administratoren andere Benutzer verwalten, sperren und ebenfalls zu Administratoren machen können.
In diesem Tutorial bauen wir auf der Authentication aus dem vorherigen Revisit auf.
Voraussetzungen
Für dieses Tutorial benötigen wir bereits eine funktionierende Benutzer-Authentifizierung.
Unser User verwendet:
has_secure_password
und die Authentication wurde mit:
bin/rails generate b4um:authentication User
eingerichtet.
Login und Logout sollten also bereits funktionieren.
Falls du direkt aus dem vorherigen Tutorial kommst, kannst du dieselbe Rails-Anwendung weiterverwenden.
Ausgangssituation
Admin-Generator ausführen
Jetzt erweitern wir unser bestehendes User-Modell um die Administratorverwaltung.
Dazu führen wir aus:
bin/rails generate b4um:admin User
Der Generator erkennt unsere vorhandene Authentication und ergänzt die dafür benötigten Bestandteile.
Unter anderem werden eine Migration, der Adminbereich, die Benutzerverwaltung und eine Rake-Task zum Erstellen des ersten Administrators erzeugt.
Admin-Generator im Terminal
Die neuen Admin-Felder
Der Generator erzeugt eine Migration, die unser User-Modell um zwei Felder erweitert:
admin
blocked
admin bestimmt, ob ein Benutzer Administratorrechte besitzt.
blocked bestimmt, ob ein Benutzerkonto gesperrt wurde.
Beide Felder sind Boolean-Werte und standardmäßig false.
Wir führen die Migration aus:
bin/rails db:migrate
Damit verfügt unsere users-Tabelle jetzt über die benötigten Informationen für die Administratorverwaltung.
Migration
Der erste Administrator
Jetzt haben wir zwar die technische Unterstützung für Administratoren, aber noch keinen Benutzer mit Administratorrechten.
Genau dafür erzeugt der Admin-Generator eine eigene Rake-Task:
bin/rails b4um:admin:create
Die Task fragt interaktiv nach den benötigten Benutzerdaten.
Je nachdem, welche Pflichtfelder unser User-Modell besitzt, werden diese automatisch berücksichtigt.
Bei unserem User sind das beispielsweise:
Name:
Email:
Password:
Password confirmation:
Nach erfolgreicher Erstellung erhalten wir unseren ersten Administrator.
Der entscheidende Unterschied zu einem normalen Benutzer ist:
admin: true
Damit darf dieser Benutzer auf den geschützten Adminbereich zugreifen.
Ersten Administrator erstellen
Als Administrator anmelden
Jetzt starten wir unsere Rails-Anwendung und öffnen:
/login
Wir melden uns mit dem gerade erstellten Administrator an.
Nach erfolgreicher Anmeldung können wir den Adminbereich aufrufen:
/admin
Der Adminbereich ist ausschließlich für Benutzer vorgesehen, deren admin-Feld auf true steht.
Ein normal angemeldeter Benutzer erhält keinen Zugriff.
Admin-Dashboard
Wie wird der Adminbereich geschützt?
Der Generator ergänzt unsere vorhandene Authentication um eine weitere Prüfung.
Neben:
current_user
logged_in?
require_login
steht jetzt auch eine Methode zur Verfügung, die Administratorrechte verlangt:
def require_admin
return if logged_in? && current_user.admin?
redirect_to root_path, alert: "Access denied."
end
Admin-Controller können damit geschützt werden.
Das bedeutet:
Ein Besucher ohne Login erhält keinen Zugriff.
Ein normal angemeldeter Benutzer erhält ebenfalls keinen Zugriff.
Nur ein angemeldeter Benutzer mit:
admin?
# => true
darf den Adminbereich verwenden.
require_admin in VS Code
Benutzer verwalten
Der Admin-Generator erstellt außerdem eine Benutzerverwaltung.
Wir öffnen:
/admin/users
Hier sehen wir die vorhandenen Benutzer unserer Anwendung.
Neben den normalen Benutzerdaten erkennen wir auch, ob ein Benutzer Administrator ist und ob sein Konto gesperrt wurde.
Abhängig vom Zustand des Benutzers stehen entsprechende Aktionen zur Verfügung.
Benutzerverwaltung
Einen Benutzer sperren
Administratoren können Benutzerkonten sperren.
Dazu verwenden wir in der Benutzerverwaltung die Aktion:
Block
Nach dem Sperren ändert sich der Status des Benutzers.
Aus:
Blocked: No
wird:
Blocked: Yes
und statt Block steht anschließend die Möglichkeit Unblock zur Verfügung.
Gesperrter Benutzer
Was passiert mit einem gesperrten Benutzer?
Ein gesperrtes Konto kann sich nicht mehr normal anmelden.
Beim Login prüft die Authentication nicht nur E-Mail-Adresse und Passwort, sondern berücksichtigt auch den Status des Benutzerkontos.
Versucht ein gesperrter Benutzer sich anzumelden, wird die Anmeldung abgelehnt.
Auch eine bereits bestehende Session kann dadurch nicht einfach dauerhaft weiterverwendet werden.
Damit kann ein Administrator den Zugriff eines Benutzerkontos unterbinden, ohne den Benutzer sofort löschen zu müssen.
Das ist insbesondere dann sinnvoll, wenn das Konto oder die dazugehörigen Daten erhalten bleiben sollen.
Login eines gesperrten Benutzers
Benutzer wieder freigeben
Eine Sperre ist nicht endgültig.
Über:
Unblock
kann der Administrator das Konto wieder freigeben.
Danach gilt wieder:
Blocked: No
und der Benutzer kann sich erneut mit seinen normalen Zugangsdaten anmelden.
Wir müssen den Benutzer dafür nicht neu erstellen und auch sein Passwort wird nicht verändert.
Einen weiteren Administrator erstellen
Administratoren können einem vorhandenen Benutzer ebenfalls Administratorrechte geben.
In der Benutzerverwaltung verwenden wir dafür:
Make admin
Der entsprechende Benutzer erhält:
admin: true
und kann anschließend ebenfalls den Adminbereich verwenden.
Zweiter Administrator
Administratorrechte wieder entziehen
Administratorrechte können ebenfalls wieder entzogen werden.
Damit wird:
admin: true
wieder zu:
admin: false
Der Benutzer bleibt dabei ein vollkommen normales Benutzerkonto.
Login und Passwort bleiben erhalten – lediglich der Zugriff auf den Adminbereich entfällt.
Damit können Administratorrechte unabhängig von der eigentlichen Benutzer-Authentifizierung verwaltet werden.
Schutz des eigenen Administratorkontos
Bei einer Administratorverwaltung müssen wir darauf achten, dass wir uns nicht versehentlich selbst aus der Anwendung aussperren.
Deshalb behandelt die generierte Benutzerverwaltung das aktuell verwendete Administratorkonto entsprechend vorsichtig.
In unserer Benutzerübersicht sieht man beispielsweise, dass beim eigenen Administratorkonto nicht dieselben gefährlichen Aktionen angeboten werden wie bei anderen Benutzern.
Benutzer löschen
Administratoren können Benutzer auch vollständig löschen.
Im Gegensatz zu Block wird das Konto dabei tatsächlich aus der Anwendung entfernt.
Deshalb sollte diese Aktion nur verwendet werden, wenn der Benutzer wirklich gelöscht werden soll.
Für einen vorübergehenden Zugriffsentzug ist Block die bessere Wahl.
Die generierte Oberfläche verlangt vor dem Löschen eine Bestätigung, damit ein Benutzer nicht versehentlich entfernt wird.
Admin-Routen
Der Generator richtet auch die benötigten Routen ein.
Wir können sie beispielsweise mit:
bin/rails routes | grep admin
anzeigen.
Dazu gehören das Admin-Dashboard sowie die Aktionen für die Benutzerverwaltung.
Neben der Benutzerübersicht stehen unter anderem Aktionen zum Sperren, Entsperren sowie zum Vergeben und Entziehen von Administratorrechten zur Verfügung.
Damit müssen wir diese REST-Routen nicht manuell zusammensetzen.
Admin-Routen
Authentication und Admin arbeiten zusammen
Der entscheidende Punkt dieses Generators ist, dass wir kein zweites, unabhängiges Login-System für Administratoren benötigen.
Ein Administrator ist weiterhin ein ganz normaler Benutzer unserer Anwendung.
Der Unterschied besteht lediglich in:
admin: true
Unsere bestehende bcrypt-Authentication bleibt also vollständig erhalten.
Das ergibt eine einfache Hierarchie:
Besucher
↓
Benutzer
↓
Administrator
Ein Benutzer meldet sich weiterhin über dieselbe Login-Seite an.
Erst danach entscheidet die Anwendung anhand seiner Berechtigungen, welche Bereiche er verwenden darf.
Fazit
Mit:
bin/rails generate b4um:admin User
können wir eine bestehende b4um-Authentication um eine vollständige Administratorverwaltung erweitern.
Der Generator ergänzt die benötigten Datenbankfelder, erstellt einen geschützten Adminbereich und stellt eine Benutzerverwaltung bereit.
Administratoren können Benutzer sperren und wieder freigeben, weitere Administratoren bestimmen und Benutzerkonten löschen.
Der erste Administrator kann bequem über:
bin/rails b4um:admin:create
angelegt werden.
Damit haben wir nun zwei wichtige Ebenen unserer Benutzerverwaltung eingerichtet:
normale Benutzer und Administratoren.
Im nächsten Tutorial ergänzen wir noch eine dritte Möglichkeit:
Temporärer Gastzugang mit dem b4um Generator
Dabei können Besucher die Anwendung zunächst ohne dauerhaftes Benutzerkonto verwenden und ihr Gastkonto später in ein normales Konto umwandeln.
Wir verwenden Cookies, um Inhalte und Anzeigen zu personalisieren,
Funktionen für soziale Medien anbieten zu können und die Zugriffe auf
unsere Website zu analysieren.
Sie akzeptieren unsere Cookies, wenn Sie fortfahren diese Webseite zu
nutzen.
Datenschutzerklärung.