Implementação de "Remember Me" em uma aplicação Rails

votos
46

Meu Rails app tem um sinal na caixa com uma caixa de seleção Remember Me. Os usuários que verificar que a caixa deve permanecer registrado no mesmo depois de fechar o seu browser. Eu estou mantendo o controle de se os usuários está logado, armazenando seu id na sessão do usuário.

Mas as sessões são implementadas em Rails como cookies de sessão, que não são persistentes. Posso fazer -lhes persistente:

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

Mas que parece ser um hack, o que é surpreendente para tal funcionalidade comum. Existe alguma maneira melhor?

Editar

A resposta de Gareth é muito bom, mas eu ainda gostaria de uma resposta de alguém familiarizado com Rails 2 (por causa de sua única CookieSessionStore).

Publicado 02/08/2008 em 13:56
fonte usuário
Em outras línguas...                            


8 respostas

votos
26

Você deve quase certamente não ser estendendo o cookie de sessão para ser vivido por muito tempo.

Embora não trate especificamente com trilhos este artigo vai para algum tempo para explicar 'Remember Me' melhores práticas.

Em resumo, embora você deve:

  • Adicionar uma coluna extra para a mesa que o usuário aceite um grande valor aleatório
  • Definir um cookie de longa vida no cliente que combina a ID de usuário eo valor aleatório
  • Quando uma nova sessão começa, verificar a existência do cookie do ID / valor e autenticar o novo usuário se eles combinam.

O autor também recomenda invalidar o valor aleatório e redefinir o cookie em cada login. Pessoalmente eu não gosto que, como você, então não pode ficar conectado em um site em dois computadores. Eu tenderia a se certificar de função minha senha mudança também redefinir o valor aleatório travando assim a sessões em outras máquinas.

Como nota final, o conselho que ele dá em fazer determinadas funções (mudança de alteração de senha / e-mail etc) disponível para sessões de auto autenticado vale bem a pena seguir, mas raramente visto no mundo real.

Respondeu 02/08/2008 em 17:10
fonte usuário

votos
10

Eu passei um tempo pensando sobre isso e chegou a algumas conclusões. Trilhos cookies de sessão são invioláveis ​​por padrão, então você realmente não precisa se preocupar com um cookie que está sendo modificado no lado do cliente.

Aqui está o que eu fiz:

  • cookie de sessão é definida para ser de longa duração (6 meses ou mais)
  • Dentro da loja sessão
    • Um 'expira em' data que está definido para iniciar sessão + 24 horas
    • ID do usuário
    • Autenticado = true para que eu possa permitir sesssions usuário anônimo (não é perigoso por causa da proteção contra adulterações cookie)
  • Eu adiciono um before_filter no Controlador de aplicativo que verifica a 'expira em' parte da sessão.

Quando o usuário verifica o "Remember Me" caixa, eu apenas definir a sessão [: expireson] data a sessão + 2 semanas. Ninguém pode roubar o cookie e permanecer ligado para sempre ou mascarar como um outro usuário porque o cookie de sessão trilhos é inviolável.

Respondeu 16/09/2008 em 22:37
fonte usuário

votos
9

Gostaria de sugerir que você quer dar uma olhada no restful_authentication plug in, que tem uma implementação deste, ou apenas mudar a sua implementação para usar a RESTful Authentication_plugin. Há uma boa explicação sobre como usar este plug-in no Railscasts:

Railscasts # 67 restful_authentication

Aqui está um link para o próprio plug-in

restful_authentication

Respondeu 17/09/2008 em 15:17
fonte usuário

votos
5

O plugin restful_authentication tem uma boa implementação do presente:

http://agilewebdevelopment.com/plugins/restful_authentication

Respondeu 06/08/2008 em 22:30
fonte usuário

votos
3

Gostaria de ir para Devise para uma solução de autenticação brilhante para trilhos.

Respondeu 16/01/2011 em 05:26
fonte usuário

votos
3

Note que você não quer que a persistir a sessão, apenas a sua identidade. Você vai criar uma nova sessão para eles quando voltar para o seu site. Geralmente você apenas atribuir um GUID para o usuário, escreve que a seu cookie, em seguida, usá-lo para procurá-los quando eles voltam. Não use seu nome de login ou ID de usuário para o token como ele poderia facilmente ser adivinhada e permitir que os visitantes astutos para roubar contas de outros usuários.

Respondeu 01/09/2008 em 22:46
fonte usuário

votos
3

Este é um bom write-up de um caras experiência de criação de sessões persistentes de 30 dias.

AVISO: blog post é a partir de 2006

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

Respondeu 03/08/2008 em 02:53
fonte usuário

votos
2

Isso funcionou como um encanto para mim:

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

Agora minhas sessões CookieStore expiram depois de duas semanas, em que o usuário deve apresentar as suas credenciais de login novamente, a fim de ser persistentemente logado por mais duas semanas.

Bascially, é tão simples como:

  1. incluindo um arquivo em vendor / plugins diretório
  2. sessão valor de expiração conjunto no controlador de aplicativo usando apenas uma linha
Respondeu 20/09/2008 em 09:58
fonte usuário

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