在Rails应用程序中实现“记住我”
我的Rails应用程序有一个“记住我”checkbox的login框。 即使在closures浏览器之后,选中该框的用户也应该保持login状态。 我正在跟踪用户是否通过在用户的会话中存储他们的IDlogin。
但是,会话在Rails中以会话cookie的forms实现,这不是持久的。 我可以让他们持久:
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
但是,这似乎是一个黑客,这是常见的function,这是令人惊讶的。 有没有更好的办法?
编辑
Gareth的答案相当不错,但我仍然喜欢熟悉Rails 2的人的回答(因为它是独特的CookieSessionStore
)。
我花了一段时间思考这个问题,并得出了一些结论。 Rails会话cookie在默认情况下是防篡改的,所以您实际上不必担心在客户端上修改cookie。
这是我所做的:
- 会话cookie设置为长期(6个月左右)
- 在会议商店里面
- “过期”date设置为login+ 24小时
- 用户名
- Authenticated = true,所以我可以允许匿名用户sesssions(由于cookie防篡改而不危险)
- 我在应用程序控制器中添加一个before_filter,用于检查会话的“过期”部分。
当用户选中“记住我”框时,我只需将会话[:expireson]date设置为login+ 2周。 没有人可以窃取cookie并永久保持login状态,或伪装成另一个用户,因为导轨会话cookie是防篡改的。
您几乎可以肯定不会将会话cookie延长到很长时间。
虽然不是专门讨论rails, 但本文花了一些时间来解释“记住我”的最佳实践。
总之,你应该:
- 在用户表中添加一个额外的列来接受一个大的随机值
- 在客户端设置一个长寿命的cookie,它将用户ID和随机值组合在一起
- 当一个新的会话开始时,检查是否存在id / value cookie,如果匹配,则authentication新用户。
作者还build议使随机值无效并在每次login时重置Cookie。 我个人不喜欢,因为你不能保持login到两台计算机上的网站。 我倾向于确保我的密码更改function也重置随机值,从而locking其他机器上的会话。
作为最后一个注意事项,他提供的关于使某些function(密码更改/电子邮件更改等)不可用于自动validation会话的build议值得关注,但在现实世界中很less见到。
我build议你或者看一下RESTful_Authentication插件,它有一个这样的实现,或者把你的实现切换到使用RESTful Authentication_plugin。 关于如何在Railscasts中使用这个插件有一个很好的解释:
railscasts#67 restful_authentication
这是一个链接到插件本身
restful_authentication
restful_authentication插件有一个很好的实现:
http://agilewebdevelopment.com/plugins/restful_authentication
请注意,你不想坚持他们的会议,只是他们的身份。 当他们返回您的网站时,您将为他们创build一个新的会话。 通常你只需要给用户分配一个GUID,把它写到他们的cookie中,然后用它们在他们回来的时候查看它们。 不要使用他们的login名或用户ID作为标记,因为它很容易被猜到,并允许狡猾的访问者劫持其他用户的帐户。
这是一个非常好的创build30天持续性会议的家伙的经验。
警告:博客文章是从2006年
http://grahamglass.blogs.com/main/2006/05/rails_sessionsr.html
我会去devise一个辉煌的authentication解决scheme的轨道。
这对我来说就像一个魅力:
http://squarewheel.wordpress.com/2007/11/03/session-cookie-expiration-time-in-rails/
现在,我的CookieStore会话将在两周后过期,用户必须再次提交login凭据才能持续login两周。
基本上,它是如此简单:
- 包括供应商/插件目录中的一个文件
- 使用一行在应用程序控制器中设置会话过期值