La mise en œuvre de « Se souvenir de moi » dans une application Rails

voix
46

Mon Rails-app a un signe dans une boîte avec une case à cocher remember me. Les utilisateurs qui doivent cocher cette case rester connecté même après avoir fermé leur navigateur. Je garde une trace de savoir si les utilisateurs sont connectés en stockant leur carte d'identité dans la session de l'utilisateur.

Mais les sessions sont mises en œuvre Rails que les cookies de session, qui ne sont pas persistants. Je peux faire les 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 telle fonctionnalité commune. Y a-t-il une meilleure façon?

modifier

La réponse de Gareth est assez bonne, mais je voudrais encore une réponse de quelqu'un familier avec Rails 2 ( à cause de cela est unique CookieSessionStore).

Créé 02/08/2008 à 13:56
source utilisateur
Dans d'autres langues...                            


8 réponses

voix
26

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

Bien que non spécifiquement de rails cet article va assez longuement pour expliquer « me rappeler les » meilleures pratiques.

En résumé si vous devez:

  • Ajouter une colonne supplémentaire à la table utilisateur d'accepter une grande valeur aléatoire
  • Initie un cookie longtemps vécu sur le client qui combine l'ID utilisateur et la valeur aléatoire
  • Quand une nouvelle session démarre, vérifier l'existence de l'identifiant / cookie valeur et authentifier le nouvel utilisateur si elles correspondent.

L'auteur recommande également invalidant la valeur aléatoire et remise à zéro du cookie à chaque connexion. Personnellement, je n'aime pas que vous ne pouvez pas alors rester connecté à un site sur deux ordinateurs. Je aurais tendance à faire fonctionner que mon changement de mot de passe également remis à zéro la valeur aléatoire bloquant ainsi des sessions sur d'autres machines.

Comme note finale, les conseils qu'il donne à rendre certaines fonctions (mot de passe changement / changement de courrier électronique, etc.) indisponible pour des sessions authentifiées auto vaut bien suivante, mais rarement vu dans le monde réel.

Créé 02/08/2008 à 17:10
source utilisateur

voix
10

J'ai passé un certain temps à penser à cela et est venu à quelques conclusions. Rails cookies de session sont inviolables par défaut, donc vous n'avez pas vraiment à se soucier un cookie en cours de modification à l'extrémité client.

Voici ce que je l'ai fait:

  • cookie de session est configuré pour être de longue durée (6 mois environ)
  • A l'intérieur du magasin de la session
    • Un « arrive à échéance le » date est réglée pour se connecter + 24 heures
    • identifiant d'utilisateur
    • Authentifiées = true pour que je puisse permettre sesssions d'utilisateurs anonymes (non dangereux en raison du cookie de protection inviolable)
  • J'ajoute un before_filter dans le contrôleur d'application qui vérifie le « arrive à échéance le » partie de la session.

Lorsque l'utilisateur vérifie la « Remember Me » boîte, je viens de mettre la session [: expireson] date à vous connecter + 2 semaines. Personne ne peut voler le cookie et rester connecté pour toujours ou masquerade en tant qu'autre utilisateur, car le cookie de session de rails est inviolable.

Créé 16/09/2008 à 22:37
source utilisateur

voix
9

Je suggère que vous soit jeter un oeil à la restful_authentication brancher, qui a une mise en œuvre de ce fait, ou simplement passer l'implémentation d'utiliser le RESTful Authentication_plugin. Il y a une bonne explication sur la façon d'utiliser ce plug-in à Railscasts:

RailsCasts # 67 restful_authentication

Voici un lien vers le plug-in lui-même

restful_authentication

Créé 17/09/2008 à 15:17
source utilisateur

voix
5

Le plugin restful_authentication a une bonne mise en œuvre de celle-ci:

http://agilewebdevelopment.com/plugins/restful_authentication

Créé 06/08/2008 à 22:30
source utilisateur

voix
3

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

Créé 16/01/2011 à 05:26
source utilisateur

voix
3

Notez que vous ne voulez pas persister leur session, juste leur identité. Vous allez créer une nouvelle session pour eux quand ils reviennent sur votre site. En général, vous venez d'attribuer un GUID à l'utilisateur, écrivez que leur biscuit, utilisez-les regarder quand ils reviennent. Ne pas utiliser leur nom d'utilisateur ou un ID utilisateur pour le jeton car il pourrait facilement deviner et permettre aux visiteurs rusés de pirater d'autres comptes utilisateurs.

Créé 01/09/2008 à 22:46
source utilisateur

voix
3

Ceci est une très bonne écriture d'un gars expérience de la création de sessions persistantes de 30 jours.

AVERTISSEMENT: poste de blog est de 2006

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

Créé 03/08/2008 à 02:53
source utilisateur

voix
2

Cela a fonctionné comme un charme pour moi:

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

Maintenant, mes sessions de deux expirent après le magasin de cookies semaines, dans lequel l'utilisateur doit soumettre leurs informations de connexion à nouveau afin d'être constamment connecté pendant deux semaines.

Bascially, il est aussi simple que:

  1. dont un fichier fournisseur / plugins
  2. session de jeu dans la valeur d'expiration contrôleur d'application en utilisant une seule ligne
Créé 20/09/2008 à 09:58
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more