52 votes

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

Mon Rails-app a un signe dans la case "se souvenir de moi" case à cocher. Les utilisateurs qui cochez cette case doit rester connecté même après la fermeture de son navigateur. Je vais garder une trace de savoir si les utilisateurs sont connectés en stockant leur id dans la session de l'utilisateur.

Mais les sessions sont mises en œuvre dans les Rails comme les cookies de session, qui ne sont pas persistantes. Je peux faire persistantes:


Mais c'est un hack, ce qui est surprenant pour une telle fonctionnalité commune. Est-il un meilleur moyen?

Modifier

Gareth réponse est assez bonne, mais je voudrais quand même une réponse de quelqu'un de familier avec 2 Rails (en raison de son unique CookieSessionStore).

28voto

Gareth Simpson Points 5905

Vous devriez certainement pas à étendre le cookie de session à être de longue durée.

Bien que ne traitant spécifiquement avec des rails cet article va à une certaine longueur d'expliquer "se souvenir de moi" meilleures pratiques.

En résumé si vous devriez:

  • Pour ajouter une colonne à la table utilisateur d'accepter une grande valeur aléatoire
  • Définissez une longue durée de vie du cookie sur le client qui combine l'id de l'utilisateur et la valeur aléatoire
  • Lorsqu'une nouvelle session démarre, vérifier l'existence de l'id/valeur du cookie et d'authentifier le nouvel utilisateur si elles correspondent.

L'auteur recommande également d'invalider la valeur aléatoire et réinitialiser le cookie à chaque login. Personnellement je n'aime pas que vous ne pouvez pas rester connecté à un site sur deux ordinateurs. J'aurais tendance à veiller à ce que mon mot de passe modification de la fonction de réinitialisation de la valeur aléatoire ainsi le verrouillage de sessions sur d'autres machines.

Comme note finale, les conseils qu'il donne sur la fabrication de certaines fonctions (changement de mot de passe/email, etc) indisponible automatique des sessions authentifiées est bien la peine de suivre, mais rarement vu dans le monde réel.

12voto

Daniel Beardsley Points 6802

J'ai passé un certain temps à réfléchir à cela et en est arrivé à des conclusions. Rails les cookies de session sont inviolables par défaut, de sorte que vous n'avez pas vraiment à vous soucier d'un cookie être modifié sur le client final.

Voici ce que j'ai fait:

  • Cookie de Session est défini pour être de longue durée (6 mois ou plus)
  • À l'intérieur de la session magasin
    • Un 'expire' date fixée pour la connexion + 24 heures
    • id utilisateur
    • Authentifié = vrai si je peux permettre à l'utilisateur anonyme sesssions (pas dangereux en raison de la cookie de la protection antialtération)
  • - Je ajouter un before_filter dans le Contrôleur de l'Application qui vérifie l' 'expire' partie de la session.

Lorsque l'utilisateur coche l'option "se Souvenir de Moi", j'ai juste mis de la session[:expireson] date de connexion + 2 semaines. Personne ne peut voler le cookie et de rester toujours connecté ou de passer pour un autre utilisateur du fait de l'rails cookie de session est inviolable.

10voto

Mattew Points 197

Je voudrais vous suggérer de prendre un coup d'oeil à la RESTful_Authentication plug in, qui est une implémentation de cette, ou tout simplement passer votre mise en œuvre utilisation de l'Reposant Authentication_plugin. Il y a une bonne explication sur la façon d'utiliser cette fiche à Railscasts:

railscasts #67 restful_authentication

Voici un lien vers le plugin lui-même

restful_authentication

5voto

Jarin Udom Points 956

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

http://agilewebdevelopment.com/plugins/restful_authentication

4voto

engtech Points 1594

C’est une très bonne description de l’expérience d’un groupe de personnes ayant créé des sessions persistantes de 30 jours.

AVERTISSEMENT: l'article de blog date de 2006

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X