我的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
)。
答案 0 :(得分:28)
你几乎肯定不会将会话cookie扩展为长期存在。
虽然没有专门处理rails this article,但需要花些时间来解释“记住我”的最佳做法。
总之,你应该:
作者还建议使随机值无效并在每次登录时重置cookie。我个人不喜欢那样,因为你不能保持登录两台计算机上的网站。我倾向于确保我的密码更改功能也重置随机值,从而锁定其他机器上的会话。
作为最后一点,他提供的关于使某些功能(密码更改/电子邮件更改等)无法用于自动认证会话的建议值得关注,但在现实世界中很少见。
答案 1 :(得分:12)
我花了一些时间思考这个并得出了一些结论。 Rails会话cookie默认是防篡改的,所以你真的不必担心在客户端修改cookie。
以下是我所做的:
当用户选中“记住我”框时,我只将会话[:expireson]日期设置为登录+ 2周。没有人可以窃取cookie并永远登录或伪装成另一个用户,因为rails会话cookie是防篡改的。
答案 2 :(得分:10)
我建议你看一下RESTful_Authentication插件,它有一个实现,或者只是切换你的实现来使用RESTful Authentication_plugin。关于如何在Railscasts中使用这个插件有一个很好的解释:
railscasts #67 restful_authentication
这是插件本身的链接
答案 3 :(得分:5)
restful_authentication插件有一个很好的实现:
http://agilewebdevelopment.com/plugins/restful_authentication
答案 4 :(得分:4)
这是对一个人创建30天持续会话的经验的非常好的描述。
警告:博客文章来自2006年
http://grahamglass.blogs.com/main/2006/05/rails_sessionsr.html
答案 5 :(得分:4)
请注意,您不希望保持其会话,只是他们的身份。当他们返回您的网站时,您将为他们创建一个新的会话。通常,您只需为用户分配一个GUID,将其写入其cookie,然后在它们返回时使用它来查找它们。不要使用他们的登录名或用户ID作为令牌,因为它很容易被猜到,并允许狡猾的访客劫持其他用户的帐户。
答案 6 :(得分:3)
这对我来说很有魅力:
http://squarewheel.wordpress.com/2007/11/03/session-cookie-expiration-time-in-rails/
现在,我的CookieStore会话在两周后过期,用户必须再次提交登录凭据才能持续登录两周。
基本上,它就像:
一样简单答案 7 :(得分:3)
我会选择Devise为rails提供出色的身份验证解决方案。