[英]Implementation of "Remember me" in a Rails application
我的 Rails 应用程序有一个带有“记住我”复选框的登录框。 即使关闭浏览器,选中该框的用户仍应保持登录状态。 我通过将用户的 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
)。
您几乎肯定不应该将会话 cookie 扩展为长期存在。
尽管本文没有专门处理 rails, 但还是会用一定的篇幅来解释“记住我”的最佳实践。
总之,你应该:
作者还建议在每次登录时使随机值无效并重置 cookie。 就我个人而言,我不喜欢这样,因为这样您就无法在两台计算机上登录站点。 我倾向于确保我的密码更改功能也重置随机值,从而锁定其他机器上的会话。
最后,他给出的关于使某些功能(密码更改/电子邮件更改等)对自动验证会话不可用的建议非常值得遵循,但在现实世界中很少见。
我花了一段时间思考这个问题并得出了一些结论。 默认情况下,Rails 会话 cookie 是防篡改的,因此您真的不必担心 cookie 在客户端被修改。
这是我所做的:
当用户选中“记住我”框时,我只是将会话 [:expireson] 日期设置为登录 + 2 周。 没有人可以窃取 cookie 并永远保持登录状态或伪装成另一个用户,因为 rails 会话 cookie 是防篡改的。
我建议您查看 RESTful_Authentication 插件,它有一个实现,或者只是将您的实现切换为使用 RESTful Authentication_plugin。 关于如何在 Railscasts 中使用这个插件有一个很好的解释:
railscasts #67 restful_authentication
这是插件本身的链接
restful_authentication 插件有一个很好的实现:
http://agilewebdevelopment.com/plugins/restful_authentication
请注意,您不想保留他们的会话,只想保留他们的身份。 当他们返回到您的网站时,您将为他们创建一个新的会话。 通常,您只需为用户分配一个 GUID,将其写入他们的 cookie,然后在他们回来时使用它来查找他们。 不要使用他们的登录名或用户 ID 作为令牌,因为它很容易被猜到,并允许狡猾的访问者劫持其他用户的帐户。
这是一个很好的写一个人创建30天持久会话的经验。
警告:博客文章是从2006年开始的
http://grahamglass.blogs.com/main/2006/05/rails_sessionsr.html
这对我来说就像一个魅力:
http://squarewheel.wordpress.com/2007/11/03/session-cookie-expiration-time-in-rails/
现在,我的 CookieStore 会话将在两周后到期,因此用户必须再次提交其登录凭据才能再持续登录两周。
基本上,它很简单:
我会选择 Devise 为 Rails 提供出色的身份验证解决方案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.