ruby - Implementierung von "Remember me" in einer Rails-Anwendung

Translate

Meine Rails-App hat ein Anmeldefeld mit einem Kontrollkästchen "Erinnere dich an mich". 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 Benutzersitzung speichere.

Sitzungen werden in Rails jedoch als Sitzungscookies implementiert, die nicht dauerhaft sind. ich kannmachensie 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 solch eine gemeinsame Funktionalität überraschend ist. Gibt es einen besseren Weg?

Bearbeiten

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

This question and all comments follow the "Attribution Required."

Alle Antworten

Translate

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

Folgendes habe ich getan:

  • Sitzungscookie ist auf lange Lebensdauer eingestellt (ca. 6 Monate)
  • Inside the session store
    • Ein Verfallsdatum, das auf Login + 24 Stunden festgelegt ist
    • Benutzeridentifikation
    • Authentifiziert = wahr, damit ich anonyme Benutzersitzungen zulassen kann (wegen des Cookie-Manipulationsschutzes nicht gefährlich)
  • Ich füge im Application Controller einen before_filter hinzu, der überprüft, ob der Teil der Sitzung abläuft.

Wenn der Benutzer das Kontrollkästchen "Angemeldet bleiben" aktiviert, setze ich das Datum der Sitzung [: Ablaufdatum] auf Anmeldung + 2 Wochen. Niemand kann das Cookie stehlen und für immer angemeldet bleiben oder sich als anderer Benutzer tarnen, da das Rails-Sitzungscookie manipulationssicher ist.

Quelle
Translate

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

Obwohl nicht speziell mit SchienenDieser ArtikelEs wird ausführlich beschrieben, wie Sie sich an mich erinnern können.

Zusammenfassend sollten Sie jedoch:

  • Fügen Sie der Benutzertabelle eine zusätzliche Spalte hinzu, um einen großen Zufallswert zu akzeptieren
  • Setzen Sie auf dem Client ein langlebiges Cookie, das die Benutzer-ID und den Zufallswert kombiniert
  • Überprüfen Sie beim Starten einer neuen Sitzung, ob das ID / Wert-Cookie vorhanden ist, und authentifizieren Sie den neuen Benutzer, falls diese übereinstimmen.

Der Autor empfiehlt außerdem, den Zufallswert ungültig zu machen und das Cookie bei jeder Anmeldung zurückzusetzen. Persönlich mag ich das nicht, da Sie dann nicht auf zwei Computern an einer Site angemeldet bleiben können. Ich würde in der Regel sicherstellen, dass meine Kennwortänderungsfunktion auch den Zufallswert zurücksetzt, wodurch Sitzungen auf anderen Computern gesperrt werden.

Abschließend sei angemerkt, dass der Ratschlag, den er gibt, um bestimmte Funktionen (Kennwortänderung / E-Mail-Änderung usw.) für automatisch authentifizierte Sitzungen nicht verfügbar zu machen, es wert ist, befolgt zu werden, aber in der realen Welt selten zu sehen ist.

Quelle
Translate

Ich würde vorschlagen, dass Sie sich entweder das RESTful_Authentication-Plug-In ansehen, das eine Implementierung davon enthält, oder einfach Ihre Implementierung auf die Verwendung des RESTful Authentication_plugin umstellen. Es gibt eine gute Erklärung zur Verwendung dieses Plug-Ins bei Railscasts:

Railscasts # 67 restful_authentication

Hier ist ein Link zum Plugin selbst

restful_authentication

Quelle
Translate

Das Plugin restful_authentication hat eine gute Implementierung davon:

http://agilewebdevelopment.com/plugins/restful_authentication

Quelle
Translate

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 zu Ihrer Site zurückkehren. Im Allgemeinen weisen Sie dem Benutzer einfach eine GUID zu, schreiben diese in sein Cookie und verwenden sie dann, um sie nachzuschlagen, wenn sie zurückkommen. Verwenden Sie nicht ihren Anmeldenamen oder ihre Benutzer-ID für das Token, da dies leicht zu erraten ist und es geschickten Besuchern ermöglicht, die Konten anderer Benutzer zu entführen.

Quelle
Translate

Dies ist eine ziemlich gute Zusammenfassung der Erfahrungen eines Mannes mit der Erstellung von 30-tägigen dauerhaften Sitzungen.

WARNUNG: Der Blogbeitrag stammt aus dem Jahr 2006

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

Quelle
Translate

Das hat für mich wie ein Zauber gewirkt:

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 Anmeldeinformationen erneut senden muss, um für weitere zwei Wochen dauerhaft angemeldet zu sein.

Im Grunde ist es so einfach wie:

  1. einschließlich einer Datei im Vendor / Plugins-Verzeichnis
  2. Legen Sie den Sitzungsablaufwert im Anwendungscontroller mit nur einer Zeile fest
Quelle
Ved
Translate

Ich würde mich für Devise entscheiden, um eine brillante Authentifizierungslösung für Schienen zu erhalten.

Quelle