ruby - Implémentation de "Remember me" dans une application Rails

Translate

My Rails-app a une boîte de connexion avec une case à cocher "se souvenir de moi". Les utilisateurs qui cochent cette case doivent rester connectés même après avoir fermé leur navigateur. Je surveille si les utilisateurs sont connectés en stockant leur identifiant dans la session de l'utilisateur.

Mais les sessions sont implémentées dans Rails en tant que cookies de session, qui ne sont pas persistants. je peuxfaireeux persistants:

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

Mais cela semble être un hack, ce qui est surprenant pour une fonctionnalité aussi courante. Y a-t-il une meilleure façon?

Éditer

La réponse de Gareth est plutôt bonne, mais j'aimerais quand même une réponse de quelqu'un familier avec Rails 2 (car il est uniqueCookieSessionStore).

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

Toutes les réponses

Translate

J'ai passé un certain temps à y réfléchir et je suis arrivé à certaines conclusions. Les cookies de session Rails sont inviolables par défaut, vous n'avez donc vraiment pas à vous soucier d'un cookie en cours de modification du côté client.

Voici ce que j'ai fait:

  • Le cookie de session est configuré pour durer (environ 6 mois)
  • Inside the session store
    • Une date d'expiration définie pour la connexion + 24 heures
    • identifiant d'utilisateur
    • Authenticated = true pour que je puisse autoriser des sessions d'utilisateurs anonymes (pas dangereux en raison de la protection contre la falsification des cookies)
  • J'ajoute un before_filter dans le contrôleur d'application qui vérifie la partie «expire le» de la session.

Lorsque l'utilisateur coche la case "Se souvenir de moi", je viens de définir la date de session [: expireson] pour être connecté + 2 semaines. Personne ne peut voler le cookie et rester connecté pour toujours ou se faire passer pour un autre utilisateur car le cookie de session rails est inviolable.

La source
Translate

Vous ne devriez certainement pas prolonger le cookie de session pour qu'il dure longtemps.

Bien que ne traitant pas spécifiquement des railsCet articleva assez loin pour expliquer les meilleures pratiques «souvenez-vous de moi».

En résumé, vous devriez:

  • Ajoutez une colonne supplémentaire à la table utilisateur pour accepter une grande valeur aléatoire
  • Définissez un cookie de longue durée sur le client qui combine l'ID utilisateur et la valeur aléatoire
  • Lorsqu'une nouvelle session démarre, vérifiez l'existence du cookie id / valeur et authentifiez le nouvel utilisateur s'ils correspondent.

L'auteur recommande également d'invalider la valeur aléatoire et de réinitialiser le cookie à chaque connexion. Personnellement, je n'aime pas ça car vous ne pouvez pas rester connecté à un site sur deux ordinateurs. J'aurais tendance à m'assurer que ma fonction de changement de mot de passe réinitialise également la valeur aléatoire, bloquant ainsi les sessions sur d'autres machines.

En guise de note finale, les conseils qu'il donne pour rendre certaines fonctions (changement de mot de passe / changement d'e-mail, etc.) indisponibles pour les sessions auto-authentifiées valent la peine d'être suivis mais rarement vus dans le monde réel.

La source
Translate

Je vous suggère de jeter un coup d'œil au plug-in RESTful_Authentication, qui en a une implémentation, ou de simplement changer votre implémentation pour utiliser RESTful Authentication_plugin. Il y a une bonne explication sur la façon d'utiliser ce plug-in chez Railscasts:

railscasts # 67 restful_authentication

Voici un lien vers le plugin lui-même

restful_authentication

La source
Translate

Le plugin restful_authentication a une bonne implémentation de ceci:

http://agilewebdevelopment.com/plugins/restful_authentication

La source
Translate

Notez que vous ne souhaitez pas conserver leur session, juste leur identité. Vous créerez une nouvelle session pour eux lorsqu'ils reviendront sur votre site. Généralement, vous attribuez simplement un GUID à l'utilisateur, écrivez-le dans son cookie, puis utilisez-le pour le rechercher à son retour. N'utilisez pas leur nom de connexion ou leur ID utilisateur pour le jeton, car cela pourrait facilement être deviné et permettre aux visiteurs astucieux de détourner les comptes d'autres utilisateurs.

La source
Translate

C'est une très bonne description de l'expérience d'un gars dans la création de sessions persistantes de 30 jours.

AVERTISSEMENT: le billet de blog date de 2006

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

La source
Translate

Cela a fonctionné comme un charme pour moi:

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

Maintenant, mes sessions CookieStore expirent au bout de deux semaines, et l'utilisateur doit à nouveau soumettre ses informations de connexion afin d'être connecté de manière permanente pendant encore deux semaines.

Fondamentalement, c'est aussi simple que:

  1. y compris un fichier dans le répertoire fournisseur / plugins
  2. définir la valeur d'expiration de session dans le contrôleur d'application en utilisant une seule ligne
La source
Ved
Translate

Je choisirais Devise pour une solution d'authentification brillante pour les rails.

La source