Mic*_*are 52 ruby ruby-on-rails http
我的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
Run Code Online (Sandbox Code Playgroud)
但这似乎是一种黑客攻击,这对于这种常见功能而言是令人惊讶的.有没有更好的方法?
编辑
Gareth的答案非常好,但我仍然希望得到Rails 2熟悉的人的回答(因为它是独一无二的CookieSessionStore
).
Gar*_*son 28
您几乎肯定不会将会话cookie扩展为长期存在.
虽然没有专门讨论rails,但本文还是花了一些篇幅来解释"记住我"的最佳实践.
总之,你应该:
作者还建议使随机值无效并在每次登录时重置cookie.我个人不喜欢那样,因为你不能保持登录两台计算机上的网站.我倾向于确保我的密码更改功能也重置随机值,从而锁定其他机器上的会话.
作为最后一点,他提供的关于使某些功能(密码更改/电子邮件更改等)对自动认证会话不可用的建议非常值得关注,但在现实世界中很少见到.
Dan*_*ley 12
我花了一些时间思考这个并得出了一些结论.Rails会话cookie默认是防篡改的,所以你真的不必担心在客户端修改cookie.
这就是我所做的:
当用户选中"记住我"框时,我只将会话[:expireson]日期设置为登录+ 2周.没有人可以窃取cookie并永远登录或伪装成另一个用户,因为rails会话cookie是防篡改的.
Mat*_*tew 10
我建议你看一下RESTful_Authentication插件,它有一个实现,或者只是切换你的实现来使用RESTful Authentication_plugin.关于如何在Railscasts中使用此插件有一个很好的解释:
railscasts#67 restful_authentication
这是插件本身的链接
请注意,您不想保留他们的会话,而只想保留他们的身份。当他们返回您的网站时,您将为他们创建一个新的会话。通常,您只需为用户分配一个 GUID,将其写入他们的 cookie,然后在他们回来时使用它来查找他们。不要使用他们的登录名或用户 ID 作为令牌,因为它很容易被猜到并允许狡猾的访问者劫持其他用户的帐户。
归档时间: |
|
查看次数: |
10369 次 |
最近记录: |