Domanda

La mia app Rails ha una casella di accesso con una casella di controllo "ricordami".Gli utenti che selezionano tale casella dovrebbero rimanere connessi anche dopo aver chiuso il browser.Sto tenendo traccia se gli utenti hanno effettuato l'accesso memorizzando il loro ID nella sessione dell'utente.

Ma le sessioni vengono implementate in Rails come cookie di sessione, che non sono persistenti.Io posso Fare loro persistenti:

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

Ma sembra un trucco, il che è sorprendente per una funzionalità così comune.Esiste un modo migliore?

Modificare

La risposta di Gareth è abbastanza buona, ma vorrei comunque una risposta da qualcuno che abbia familiarità con Rails 2 (perché è unico CookieSessionStore).

È stato utile?

Soluzione

Ci ho pensato un po’ e sono giunto ad alcune conclusioni.I cookie di sessione di Rails sono a prova di manomissione per impostazione predefinita, quindi non devi preoccuparti che un cookie venga modificato sul lato client.

Ecco cosa ho fatto:

  • Il cookie di sessione è impostato per essere di lunga durata (6 mesi circa)
  • All'interno del session store
    • Una data di scadenza impostata su login + 24 ore
    • ID utente
    • Autenticato = true in modo da poter consentire sessioni utente anonime (non pericoloso a causa della protezione dalla manomissione dei cookie)
  • Aggiungo un before_filter nel controller dell'applicazione che controlla la parte "scadenza" della sessione.

Quando l'utente seleziona la casella "Ricordami", ho semplicemente impostato la data della sessione[:scadenza] in modo che sia login + 2 settimane.Nessuno può rubare il cookie e rimanere connesso per sempre o mascherarsi da altro utente perché il cookie di sessione di Rails è a prova di manomissione.

Altri suggerimenti

Quasi certamente non dovresti estendere il cookie di sessione per durare a lungo.

Anche se non si occupa specificamente di rotaie Questo articolo si estende a lungo per spiegare le migliori pratiche "ricordati di me".

In sintesi però dovresti:

  • Aggiungi una colonna aggiuntiva alla tabella utente per accettare un valore casuale elevato
  • Imposta un cookie di lunga durata sul client che combina l'ID utente e il valore casuale
  • Quando inizia una nuova sessione, controlla l'esistenza del cookie id/valore e autentica il nuovo utente se corrispondono.

L'autore consiglia inoltre di invalidare il valore casuale e di reimpostare il cookie ad ogni accesso.Personalmente non mi piace perché non puoi rimanere connesso a un sito su due computer.Tenderei ad assicurarmi che la mia funzione di modifica della password ripristini anche il valore casuale bloccando così le sessioni su altre macchine.

Come nota finale, vale la pena seguire il consiglio che fornisce su come rendere alcune funzioni (modifica della password/modifica dell'e-mail, ecc.) non disponibili per le sessioni autenticate automaticamente, ma raramente si vede nel mondo reale.

Ti suggerirei di dare un'occhiata al plug-in RESTful_Authentication, che ha un'implementazione di questo, o semplicemente di cambiare la tua implementazione per utilizzare RESTful Authentication_plugin.C'è una buona spiegazione su come utilizzare questo plug-in su Railscasts:

railscasts #67 restful_authentication

Ecco un collegamento al plugin stesso

restful_authentication

Il plugin restful_authentication ha una buona implementazione di questo:

http://agilewebdevelopment.com/plugins/restful_authentication

Tieni presente che non vuoi rendere persistente la loro sessione, ma solo la loro identità.Creerai una nuova sessione per loro quando torneranno sul tuo sito.Generalmente assegni semplicemente un GUID all'utente, lo scrivi nel suo cookie, quindi lo usi per cercarlo quando tornano.Non utilizzare il nome di accesso o l'ID utente per il token poiché potrebbe essere facilmente indovinato e consentire ai visitatori astuti di dirottare gli account di altri utenti.

Questo è un resoconto piuttosto accurato dell'esperienza di un ragazzo nella creazione di sessioni persistenti di 30 giorni.

AVVERTIMENTO:il post del blog è del 2006

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

Questo ha funzionato come un incantesimo per me:

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

Ora le mie sessioni di CookieStore scadono dopo due settimane, per cui l'utente deve inviare nuovamente le proprie credenziali di accesso per poter essere loggato in modo persistente per altre due settimane.

Fondamentalmente, è semplice come:

  1. incluso un file nella directory fornitore/plugins
  2. imposta il valore di scadenza della sessione nel controller dell'applicazione utilizzando una sola riga

Sceglierei Devise per una brillante soluzione di autenticazione per i binari.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top