Pergunta

Meu aplicativo Rails tem uma caixa de login com uma caixa de seleção "lembrar de mim".Os usuários que marcarem essa caixa deverão permanecer logados mesmo depois de fechar o navegador.Estou monitorando se os usuários estão logados armazenando seu ID na sessão do usuário.

Mas as sessões são implementadas no Rails como cookies de sessão, que não são persistentes.Eu posso fazer eles persistentes:

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 isso parece um hack, o que é surpreendente para uma funcionalidade tão comum.Existe alguma maneira melhor?

Editar

A resposta de Gareth é muito boa, mas eu ainda gostaria de uma resposta de alguém familiarizado com Rails 2 (por ser único CookieSessionStore).

Foi útil?

Solução

Passei um tempo pensando sobre isso e cheguei a algumas conclusões.Os cookies de sessão do Rails são à prova de adulteração por padrão, então você realmente não precisa se preocupar com a modificação de um cookie no lado do cliente.

Aqui está o que eu fiz:

  • O cookie de sessão está definido para ter vida longa (6 meses ou mais)
  • Dentro do armazenamento de sessão
    • Uma data de 'expiração' definida para login + 24 horas
    • ID do usuário
    • Autenticado = true para que eu possa permitir sessões de usuários anônimas (não perigosas devido à proteção contra adulteração de cookies)
  • Eu adiciono um before_filter no Application Controller que verifica a parte 'expira em' da sessão.

Quando o usuário marca a caixa "Lembrar-me", apenas defino a data da sessão[:expireson] como login + 2 semanas.Ninguém pode roubar o cookie e permanecer logado para sempre ou se passar por outro usuário porque o cookie da sessão Rails é à prova de adulteração.

Outras dicas

É quase certo que você não deveria estender o cookie de sessão para durar muito.

Embora não trate especificamente de trilhos Este artigo se esforça para explicar as melhores práticas do tipo 'lembre-se de mim'.

Em resumo, você deve:

  • Adicione uma coluna extra à tabela do usuário para aceitar um grande valor aleatório
  • Defina um cookie de longa duração no cliente que combine o ID do usuário e o valor aleatório
  • Quando uma nova sessão for iniciada, verifique a existência do cookie de id/valor e autentique o novo usuário, se eles corresponderem.

O autor também recomenda invalidar o valor aleatório e redefinir o cookie a cada login.Pessoalmente, não gosto disso, pois você não pode permanecer conectado a um site em dois computadores.Eu tenderia a garantir que minha função de alteração de senha também redefinisse o valor aleatório, bloqueando assim as sessões em outras máquinas.

Como nota final, vale a pena seguir o conselho que ele dá sobre como tornar certas funções (alteração de senha/alteração de e-mail, etc.) indisponíveis para sessões autenticadas automaticamente, mas raramente visto no mundo real.

Eu sugiro que você dê uma olhada no plug-in RESTful_Authentication, que tem uma implementação disso, ou apenas mude sua implementação para usar o 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 plugin

restful_authentication

O plugin restful_authentication tem uma boa implementação disso:

http://agilewebdevelopment.com/plugins/restful_authentication

Observe que você não deseja persistir a sessão, apenas a identidade.Você criará uma nova sessão para eles quando retornarem ao seu site.Geralmente você apenas atribui um GUID ao usuário, escreve-o no cookie e usa-o para procurá-lo quando ele voltar.Não use seu nome de login ou ID de usuário para o token, pois ele pode ser facilmente adivinhado e permite que visitantes astutos sequestrem contas de outros usuários.

Este é um ótimo relato da experiência de um cara na criação de sessões persistentes de 30 dias.

AVISO:a postagem do blog é de 2006

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

Isso funcionou perfeitamente para mim:

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

Agora minhas sessões da CookieStore expiram após duas semanas, sendo que o usuário deve enviar suas credenciais de login novamente para poder fazer login persistentemente por mais duas semanas.

Basicamente, é tão simples quanto:

  1. incluindo um arquivo no diretório vendor/plugins
  2. definir o valor de expiração da sessão no controlador de aplicativo usando apenas uma linha

Eu escolheria o Devise para uma solução de autenticação brilhante para Rails.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top