Question

Mon application Rails 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 la fermeture de leur navigateur.Je vérifie 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 sous forme de 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 ressemble à un hack, ce qui est surprenant pour des fonctionnalités aussi courantes.Y a-t-il une meilleure façon?

Modifier

La réponse de Gareth est plutôt bonne, mais j'aimerais quand même avoir une réponse de quelqu'un qui connaît Rails 2 (en raison de sa particularité). CookieSessionStore).

Était-ce utile?

La solution

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

Voici ce que j'ai fait :

  • Le cookie de session est configuré pour avoir une durée de vie longue (environ 6 mois)
  • À l'intérieur du magasin de sessions
    • Une date « d'expiration le » définie pour la connexion + 24 heures
    • ID de l'utilisateur
    • Authentifié = vrai afin que je puisse autoriser les sessions utilisateur 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] sur connexion + 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.

Autres conseils

Vous ne devriez certainement pas prolonger la durée de vie du cookie de session.

Bien que ne traitant pas spécifiquement des rails Cet article va en détail pour expliquer les meilleures pratiques « se souvenir de moi ».

En résumé, vous devriez :

  • Ajoutez une colonne supplémentaire à la table utilisateur pour accepter une grande valeur aléatoire
  • Définir un cookie de longue durée sur le client qui combine l'identifiant utilisateur et la valeur aléatoire
  • Lorsqu'une nouvelle session démarre, vérifiez l'existence du cookie identifiant/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.

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

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

railscasts #67 restful_authentication

Voici un lien vers le plugin lui-même

authentification_restante

Le plugin restful_authentication en a une bonne implémentation :

http://agilewebdevelopment.com/plugins/restful_authentication

Notez que vous ne souhaitez pas conserver leur session, mais simplement 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, l'écrivez dans son cookie, puis l'utilisez pour le rechercher à son retour.N'utilisez pas leur nom de connexion ou leur identifiant d'utilisateur pour le jeton, car ils pourraient facilement être devinés et permettre à des visiteurs astucieux de détourner les comptes d'autres utilisateurs.

Il s'agit d'un assez bon compte rendu de l'expérience d'un gars en matière de création de sessions persistantes de 30 jours.

AVERTISSEMENT:l'article de blog date de 2006

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

Cela a fonctionné à merveille pour moi :

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

Désormais, mes sessions CookieStore expirent après deux semaines, l'utilisateur devant à nouveau soumettre ses informations de connexion afin d'être connecté de manière persistante pendant encore deux semaines.

En gros, c'est aussi simple que :

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

J'opterais pour Devise pour une brillante solution d'authentification pour les rails.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top