代码之家  ›  专栏  ›  技术社区  ›  Michiel de Mare

在Rails应用程序中实现“记住我”

  •  49
  • Michiel de Mare  · 技术社区  · 16 年前

    我的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
    

    但这看起来像是一个黑客,这对于如此常见的功能来说是令人惊讶的。有更好的方法吗?

    编辑

    加雷斯的回答很好,但我还是想得到一个熟悉Rails 2的人的答案(因为它是独一无二的 CookieSessionStore )

    8 回复  |  直到 8 年前
        1
  •  10
  •   Daniel Beardsley    16 年前

    我花了一段时间思考这个问题,得出了一些结论。默认情况下,Rails会话cookie是防篡改的,因此您不必担心在客户端修改cookie。

    以下是我所做的:

    • 会话cookie设置为长寿(6个月左右)
    • 在会话存储区内
      • 设置为登录+24小时的“到期日”
      • 用户ID
      • authenticated=true,因此我可以允许匿名用户评估(因为cookie篡改保护而不危险)
    • 我在应用程序控制器中添加了一个before_过滤器,用于检查会话的“expires on”部分。

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

        2
  •  27
  •   Gareth Simpson    16 年前

    几乎可以肯定,您不应该将会话cookie扩展为长寿。

    虽然没有专门处理铁轨 this article 详细解释“记住我”的最佳实践。

    总之,你应该:

    • 向用户表中添加额外的列以接受大的随机值
    • 在客户端上设置一个长寿命cookie,该cookie将用户ID和随机值组合在一起
    • 当新会话启动时,检查是否存在ID/值cookie,如果匹配,则对新用户进行身份验证。

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

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

        3
  •  9
  •   community wiki 2 revs, 2 users 82% Mattew    12 年前

    我建议您要么看一下Restful_身份验证插件,它实现了这一点,要么将您的实现切换为使用Restful身份验证插件。关于如何在Railscants上使用此插件有一个很好的解释:

    railscasts #67 restful_authentication

    这里有一个到插件本身的链接

    restful_authentication

        4
  •  5
  •   Jarin Udom    16 年前

    restful_身份验证插件很好地实现了这一点:

    http://agilewebdevelopment.com/plugins/restful_authentication

        5
  •  3
  •   Teflon Ted    16 年前

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

        6
  •  3
  •   Dan Rosenstark    15 年前

    这是一篇很好的关于一个家伙创造30天持续会议经验的文章。

    警告:博客帖子来自2006年

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

        7
  •  3
  •   Ved    14 年前

    我会为Rails设计一个出色的身份验证解决方案。

        8
  •  2
  •   Allan L.    16 年前

    这对我来说很有吸引力:

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

    现在,我的CookieStore会话将在两周后到期,因此用户必须再次提交登录凭证,以便持续登录两周。

    基本上,它简单如下:

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