我的Rails-app有一个带有“记住我”复选框的登录框。 检查该框的用户即使在关闭浏览器后仍应保持登录状态。 我通过在用户的会话中存储他们的id来跟踪用户是否登录。

但会话在Rails中实现为会话cookie,而不是持久性的。 我可以它们持久化:

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

但这似乎是一种黑客攻击,这对于这种常见功能而言是令人惊讶的。 有没有更好的方法?

编辑

Gareth的答案非常好,但我仍然希望熟悉Rails 2的人(因为它是唯一的CookieSessionStore )得到答案。

===============>>#1 票数:28

您几乎肯定不会将会话cookie扩展为长期存在。

虽然没有专门讨论rails, 但本文还是花了一些篇幅来解释“记住我”的最佳实践。

总之,你应该:

  • 在用户表中添加一个额外的列以接受大的随机值
  • 在客户端上设置一个长期存在的cookie,它结合了用户ID和随机值
  • 当新会话开始时,检查是否存在id / value cookie,并在新用户匹配时对其进行身份验证。

作者还建议使随机值无效并在每次登录时重置cookie。 我个人不喜欢那样,因为你不能保持登录两台计算机上的网站。 我倾向于确保我的密码更改功能也重置随机值,从而锁定其他机器上的会话。

作为最后一点,他提供的关于使某些功能(密码更改/电子邮件更改等)不可用于自动认证会话的建议非常值得关注,但在现实世界中很少见到。

===============>>#2 票数:12 已采纳

我花了一些时间思考这个并得出了一些结论。 Rails会话cookie默认是防篡改的,所以你真的不必担心在客户端修改cookie。

这就是我所做的:

  • 会话cookie设置为长期(大约6个月)
  • 在会话商店内
    • 设置为登录+ 24小时的'过期'日期
    • 用户身份
    • Authenticated = true所以我可以允许匿名用户sesssions(因为cookie篡改保护而没有危险)
  • 我在Application Controller中添加了一个before_filter,用于检查会话的“expires on”部分。

当用户选中“记住我”框时,我只将会话[:expireson]日期设置为登录+ 2周。 没有人可以窃取cookie并永远登录或伪装成另一个用户,因为rails会话cookie是防篡改的。

===============>>#3 票数:10

我建议你看一下RESTful_Authentication插件,它有一个实现,或者只是切换你的实现来使用RESTful Authentication_plugin。 关于如何在Railscasts中使用此插件有一个很好的解释:

railscasts#67 restful_authentication

这是插件本身的链接

restful_authentication

===============>>#4 票数:5

restful_authentication插件有一个很好的实现:

http://agilewebdevelopment.com/plugins/restful_authentication

===============>>#5 票数:4

请注意,您不希望保持其会话,只是他们的身份。 当他们返回您的网站时,您将为他们创建一个新的会话。 通常,您只需为用户分配一个GUID,将其写入其cookie,然后在它们返回时使用它来查找它们。 不要使用他们的登录名或用户ID作为令牌,因为它很容易被猜到,并允许狡猾的访客劫持其他用户的帐户。

===============>>#6 票数:4

这是一个很好的写一个人创建30天持久会话的经验。

警告:博客文章是从2006年开始的

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

===============>>#7 票数:3

这对我来说就像一个魅力:

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

现在,我的CookieStore会话在两周后过期,用户必须再次提交其登录凭据才能持续登录两周。

基本上,它很简单:

  1. 包括vendor / plugins目录中的一个文件
  2. 仅使用一行在应用程序控制器中设置会话到期值

===============>>#8 票数:3

我会选择Devise为rails提供出色的身份验证解决方案。

  ask by Michiel de Mare translate from so

未解决问题?本站智能推荐:

关注微信公众号