In Webanwendungen mit privaten Zonen, auf die nur registrierte Mitglieder zugreifen dürfen, müssen Mechanismen implementiert werden, die es den Benutzern ermöglichen, nur zu sehen, wenn sie authentifiziert sind.
Filter
Filter sind Rails- Tools, mit denen wir Aufrufe von Methoden und Aktionen abfangen und unsere Methoden vorher, während oder nachher hinzufügen können, damit wir den Ablauf der Anwendung nach eigenem Ermessen steuern können, um unsere Funktionen zu erfüllen. In dieser Phase verwenden wir den Vorher-Filter , um die Aufrufe unserer Aktionen abzufangen. Auf diese Weise können wir die Sitzung überprüfen und feststellen, ob der Benutzer angemeldet ist. Wenn nicht, leiten Sie sie an die von uns festgelegte Stelle weiter. Diese Methode wird in unserem Anwendungscontroller abgelegt, da sie die Basis darstellt und auf diese Weise für die gesamte Anwendung verfügbar ist.
Schauen wir uns den Code an, den wir dafür haben:
def autorisieren Es sei denn, Sitzung [: user_id] flash [: notice] = "Bitte einloggen" redirect_to (: controller => "login" ,: action => "login") ende ende
Da wir sehen, dass die Logik dahinter recht einfach ist, verwenden wir Rubys eigene Bedingung, die es uns ermöglicht, zu bedingen, dass der Code des Blocks ausgeführt wird, wenn die Bedingung nicht erfüllt ist. Sofern wir in der Sitzung keine ID eines Benutzers haben, leiten wir diese um und bitten ihn, sich in der Anwendung zu authentifizieren.
Jetzt filtern wir im Controller unseres Administrators und bitten die Benutzer, sich zu authentifizieren:
Klasse AdminController <ApplicationController before_filter: autorisieren
Und in unserem Login-Controller machen wir auch etwas Ähnliches, nur werden wir die Ausnahme der Login-Aktion hinzufügen, die wir wollen und die jeder nicht authentifizierte Benutzer sehen kann:
Klasse LoginController <ApplicationController before_filter: authorize ,: except =>: login
Wenn wir nicht angemeldet sind, sollte beim Zugriff auf die Verwaltungsseite der Anwendung Folgendes angezeigt werden:
Jetzt haben wir die Möglichkeit, zu übernehmen und zu filtern, dass Benutzer die Administrationsfenster nicht sehen können, wenn sie nicht angemeldet sind. Wir haben jedoch eine letzte Inkonsistenz, da wir beim Entfernen von Benutzern das Löschen des allgemeinen Administrators der Anwendung vermeiden müssen, da wenn Tun wir dies nicht, besteht die Möglichkeit, dass ein Benutzer alle Benutzer löscht und wir keinen Zugriff haben, es sei denn, wir ändern die Datenbank direkt und dies ist für unsere Anwendung nicht akzeptabel. Aus diesem Grund erstellen wir erneut ein spezielles Ereignis. In diesem Fall handelt es sich um before_destroy , bei dem vor der Aktion destroy eine Methode ausgeführt wird.
Sehen wir uns den Code an:
before_destroy: dont_destroy_dave def dont_destroy_dave Raise "Kann Dave nicht zerstören" wenn self.name == 'dave' ende
Dann erfassen wir in unserer Löschaktion die Nachricht und zeigen sie an. Sehen wir uns den Code der Aktion an:
def delete_user id = params [: id] if id && user = User.find (id) beginne user.destroy flash [: notice] = "Benutzer # {user.name} gelöscht" retten flash [: notice] = "Benutzer kann nicht gelöscht werden" ende ende redirect_to (: action =>: list_users) ende
Mit diesem Abschluss unseres Lernprogramms zur Zugriffsbeschränkung in unserer Anwendung ist es wichtig, alle Möglichkeiten abzudecken, um zu verhindern, dass nicht autorisierte Benutzer unseren administrativen Teil sehen oder ändern können, um zukünftige Kopfschmerzen und Sicherheitsprobleme zu vermeiden, die unsere Anwendung verursachen unsicher und instabil.