2012-03-29 17 views
2

Ich entwickle eine Anwendung und ich möchte dem Benutzer eine Möglichkeit bieten, in für immer signiert bleiben. Wenn er ein Kästchen ankreuzt, sollte seine Sitzung niemals enden, es sei denn, er löscht das Cookie manuell aus oder löscht es. Ist dies nicht der Fall, verfällt sein Sitzungscookie beim Schließen des Browsers.Lassen Sie den Benutzer für immer angemeldet bleiben - Verschiedene Implementierungsmethoden

als ich drei Möglichkeiten, dies zu realisieren, aber alle von ihnen enthalten Vor- und Nachteile:

  • ein Cookie mit dem Benutzernamen und sein gehashte Passwort Speichern:
    • Pro: Der Benutzer kann mehrere aktive Sitzungen auf verschiedenen Geräten haben.
    • Con: Wenn der Cookie von Dritten durchgesickert wird, kann er seine Sitzung jederzeit neu generieren, es sei denn, er ändert sein Passwort.
  • Erzeugen eines Token, die in der Datenbank gespeichert und in die Cookies des Benutzers. Dann vergleiche sie:
  • Pro: Sobald der Benutzer abmeldet, wird das Token randomisiert und alle seiner Sitzungen werden zerstört. Er wird definitiv eingeloggt sein.
  • Con: Der Benutzer kann sich nur für immer mit einem Gerät anmelden. Sobald er sich von einem anderen Gerät anmeldet und akzeptiert, dass er für immer angemeldet ist, wird sein anderer Token überschrieben.
  • Nur hypothetisch: Speichern Sie Sitzungen für immer auf dem Server und geben Sie dem Benutzer nicht auslaufende Cookies.
    • Con: Dies ist wahrscheinlich nicht realistisch, weil Sie nicht so viele Daten auf effiziente Weise speichern können.

Ich ziehe es zur Zeit den zweiten Weg, weil sie nicht wie die ersten zu sein, wie unsicher scheinen und es ist leicht implementierbar. Aber ich bin immer noch nicht davon überzeugt und ich habe gesehen, dass es bewährte Frameworks gibt, die es anders machen.

Können Sie sich einen anderen Weg vorstellen, der vielleicht noch besser ist? Was ist dein Favorit und warum?

Antwort

4

Speichern Sie niemals das Passwort in einem Cookie. Die zweite Methode ist in Ordnung, und ich denke, dass Sie feststellen werden, dass die meisten Apps diese Funktion implementieren. Beachten Sie, dass der Sitzungsspeicher keine Datenbank sein muss. Der Cookie enthält eine eindeutige (nicht identifizierbare!) ID, und diese ID verweist auf einen eindeutigen Speicher. Es könnte eine Textdatei in einem Verzeichnis irgendwo sein, eine Datenbankzeile, eine JSON-Zeichenfolge in memcached, was auch immer.

Pro: Sobald sich der Benutzer abmeldet, wird das Token randomisiert und alle seine Sitzungen werden zerstört werden. Er wird definitiv von protokolliert werden.

Con: Der Benutzer kann sich nur für immer mit einem Gerät anmelden. Sobald sich von einem anderen Gerät anmeldet und akzeptiert, für immer angemeldet zu sein, wird sein anderes Token überschrieben.

Speichern Sie die Token-ID nicht als Spalte in der Benutzertabelle. Erstellen Sie stattdessen eine neue Kreuztabelle, die mehr als eine Sitzung pro Benutzer zulässt. Jedes Gerät hat also sein eigenes separates Token und somit seine eigene separate Sitzung, die einzeln verwaltet werden kann.

Wenn ein Benutzer sich abmeldet, zerstören Sie nur diesen einen Cookie und den zugehörigen Sitzungsspeicher. Alle anderen Sitzungen, die der Benutzer aussteht, bleiben unberührt.

+0

Erstellen mehrere Tokens pro Benutzer scheint eine sehr gute Idee zu sein! Vielen Dank! Dies löst das Problem des unbeabsichtigten Überschreibens des "eindeutigen Tokens". Ich habe es mir in Erinnerung gebracht und bin auf das folgende Problem gestoßen: Wenn es Nutzer gibt, die sich immer für immer anmelden, aber alle ihre Cookies löschen, ohne sich einzuloggen, würden sie die Datenbank irgendwie spammen. Gibt es einen besseren Weg, dies zu verhindern, anstatt alte Sitzungen zu löschen, sobald mehr als X vorhanden sind? Übrigens - mein erster Vorschlag hatte nicht die Absicht, das Passwort des Benutzers in einem Cookie zu speichern: Ich würde eine gehashte und gesalzene Darstellung speichern. – YMMD

+0

Ich würde bei jedem Zugriff auf einen Zeitstempel im Sitzungsspeicher tippen und dann ein Cron-Skript schreiben (oder es als Garbage Collection in Ihre App einbauen), das alle Sitzungen löscht, auf die in X Tagen nicht zugegriffen wurde. Es ist also nur eine unbestimmte Anmeldung, wenn Sie aktiv bleiben. –

+1

Und ja, ich verstand das Hashing. Es spielt keine Rolle, ob es hashed ist. Wenn Ihre App den Zugriff basierend auf einem bereits gehashten Passwort erlaubt, unterscheidet sich das Hash-Passwort nicht von der Vergabe des Klartext-Passworts. –

Verwandte Themen