Frage

Meine Rails-App verfügt über ein Anmeldefeld mit einem Kontrollkästchen „An mich erinnern“.Benutzer, die dieses Kontrollkästchen aktivieren, sollten auch nach dem Schließen ihres Browsers angemeldet bleiben.Ich verfolge, ob Benutzer angemeldet sind, indem ich ihre ID in der Sitzung des Benutzers speichere.

Aber Sitzungen werden in Rails als Sitzungscookies implementiert, die nicht dauerhaft sind.Ich kann machen sie hartnäckig:

class ApplicationController < ActionController::Base
  before_filter :update_session_expiration_date

  private

  def update_session_expiration_date
    options = ActionController::Base.session_options
    unless options[:session_expires]
      options[:session_expires] = 1.year.from_now
    end
  end
end

Aber das scheint ein Hack zu sein, was für eine so häufige Funktionalität überraschend ist.Gibt es einen besseren Weg?

Bearbeiten

Gareths Antwort ist ziemlich gut, aber ich hätte trotzdem gerne eine Antwort von jemandem, der mit Rails 2 vertraut ist (weil es einzigartig ist). CookieSessionStore).

War es hilfreich?

Lösung

Ich habe eine Weile darüber nachgedacht und bin zu einigen Schlussfolgerungen gekommen.Rails-Sitzungscookies sind standardmäßig manipulationssicher, Sie müssen sich also keine Sorgen machen, dass ein Cookie auf Client-Seite geändert wird.

Folgendes habe ich getan:

  • Das Sitzungscookie ist auf eine lange Lebensdauer (ca. 6 Monate) eingestellt.
  • Im Sitzungsspeicher
    • Ein „Ablaufdatum“, das auf „Anmeldung + 24 Stunden“ eingestellt ist
    • Benutzer-ID
    • Authenticated = true, damit ich anonyme Benutzersitzungen zulassen kann (nicht gefährlich aufgrund des Cookie-Manipulationsschutzes)
  • Ich füge im Application Controller einen before_filter hinzu, der den „Ablaufdatum“-Teil der Sitzung überprüft.

Wenn der Benutzer das Kontrollkästchen „Angemeldet bleiben“ aktiviert, stelle ich das Sitzungsdatum[:expireson] einfach auf „Anmeldung + 2 Wochen“ ein.Niemand kann das Cookie stehlen und für immer angemeldet bleiben oder sich als ein anderer Benutzer ausgeben, da das Rails-Sitzungscookie manipulationssicher ist.

Andere Tipps

Sie sollten das Sitzungscookie mit ziemlicher Sicherheit nicht auf eine lange Lebensdauer verlängern.

Obwohl es nicht speziell um Schienen geht Dieser Artikel geht ausführlich auf die Erläuterung der Best Practices für die Erinnerung an mich ein.

Zusammenfassend sollten Sie jedoch Folgendes tun:

  • Fügen Sie der Benutzertabelle eine zusätzliche Spalte hinzu, um einen großen Zufallswert zu akzeptieren
  • Legen Sie auf dem Client ein langlebiges Cookie fest, das die Benutzer-ID und den Zufallswert kombiniert
  • Wenn eine neue Sitzung beginnt, prüfen Sie, ob das ID-/Wert-Cookie vorhanden ist, und authentifizieren Sie den neuen Benutzer, wenn diese übereinstimmen.

Der Autor empfiehlt außerdem, den Zufallswert zu ungültig zu machen und das Cookie bei jedem Login zurückzusetzen.Persönlich gefällt mir das nicht, da man dann nicht auf zwei Computern in einer Site angemeldet bleiben kann.Ich würde tendenziell sicherstellen, dass meine Funktion zum Ändern des Passworts auch den Zufallswert zurücksetzt und so Sitzungen auf anderen Computern sperrt.

Abschließend möchte ich sagen, dass seine Ratschläge, bestimmte Funktionen (Passwort-/E-Mail-Änderung usw.) für automatisch authentifizierte Sitzungen nicht verfügbar zu machen, durchaus befolgt werden sollten, in der Praxis jedoch nur selten anzutreffen sind.

Ich würde vorschlagen, dass Sie sich entweder das RESTful_Authentication-Plugin ansehen, das eine Implementierung davon hat, oder einfach Ihre Implementierung ändern, um das RESTful Authentication_plugin zu verwenden.Bei Railscasts gibt es eine gute Erklärung zur Verwendung dieses Plug-Ins:

Railscasts #67 restful_authentication

Hier ist ein Link zum Plugin selbst

restful_authentication

Das restful_authentication-Plugin hat eine gute Implementierung davon:

http://agilewebdevelopment.com/plugins/restful_authentication

Beachten Sie, dass Sie ihre Sitzung nicht beibehalten möchten, sondern nur ihre Identität.Sie erstellen eine neue Sitzung für sie, wenn sie auf Ihre Website zurückkehren.Im Allgemeinen weisen Sie dem Benutzer einfach eine GUID zu, schreiben diese in sein Cookie und verwenden sie dann, um nach ihm zu suchen, wenn er zurückkommt.Verwenden Sie nicht deren Anmeldenamen oder Benutzer-ID für das Token, da diese leicht erraten werden könnten und listigen Besuchern die Möglichkeit geben, die Konten anderer Benutzer zu kapern.

Dies ist eine ziemlich gute Zusammenfassung der Erfahrungen eines Mannes mit der Erstellung 30-tägiger persistenter Sitzungen.

WARNUNG:Der Blogbeitrag stammt aus dem Jahr 2006

http://grahamglass.blogs.com/main/2006/05/rails_sessionsr.html

Das hat bei mir wie ein Zauber funktioniert:

http://squarewheel.wordpress.com/2007/11/03/session-cookie-expiration-time-in-rails/

Jetzt laufen meine CookieStore-Sitzungen nach zwei Wochen ab, wobei der Benutzer seine Anmeldedaten erneut eingeben muss, um für weitere zwei Wochen dauerhaft eingeloggt zu bleiben.

Im Grunde ist es so einfach:

  1. einschließlich einer Datei im Verzeichnis „vendor/plugins“.
  2. Legen Sie den Sitzungsablaufwert im Anwendungscontroller mit nur einer Zeile fest

Ich würde mich für Devise entscheiden, wenn es um eine brillante Authentifizierungslösung für Schienen geht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top