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

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

0
额外 编辑
意见: 1

11 答案

尝试这个:

  1. Go to Site Actions, Manage Content and Structure.
  2. Click the View menu and change to:
    • Checked Out To Me for drafts that needs to be checked in (unfortunately there is no built-in filter to check for all drafts)
    • All Draft Documents for pages to be published
    • Pending Approval for pages to be approved
  3. Click the 'select all' icon above all of the tick boxes.
  4. Click the Action menu and choose the relevant option.

我发现“全选”无法正常工作的情况,我需要分别浏览每个页面。尽管如此,我猜的总比没有好!

3
额外
WSS是否提供选择多个页面并从Web界面一起发布的功能?我认为它应该是SharePoint服务器的标准功能,但我找不到这个功能。
额外 作者 engtech,
我没有从安装有SharePoint Server 2007的计算机上找到stsadm.exe。我是否需要安装任何其他工具才能使用stsadm?
额外 作者 engtech,
这个工具的问题是,我们必须和运行SP服务器的计算机一起运行命令行。任何远程网络界面批量批准所有未决项目?我认为它应该是WSS的标准功能,但无法找到。 :-(
额外 作者 engtech,
屏幕快照 - > i35.tinypic.com/oad8pt.png
额外 作者 engtech,
谢谢Alex!我已经尝试过,但似乎没有办法在“所有草稿文档”中提交多个项目的审批?这里是一个屏幕快照,任何想法是什么错误?
额外 作者 engtech,
由于防火墙的原因,目前无法看到您的屏幕截图。您发现的案例必须是无法在“管理内容和结构”页面中“全集”(全部一起)完成的案例。我确定我看到了一个工具或实用程序来做到这一点。如果我找到答案,我会尽快查找并更新答案。
额外 作者 Alex Angas,
好的,我在AC的博客上发现了这个: andrewconnell.com/blog/articles/ &hellip; 这是一个STSADM命令,将发布网站/网站集中的所有项目。
额外 作者 Alex Angas,
stsadm位于 C:\ Program Files \ Common Files \ Microsoft Shared \ web server extensions \ 12 \ BIN 中。是的,你是对的,它需要从服务器运行。可能会有CodePlex解决方案可以满足您的需求 - 请参阅您可以找到的内容! :-)
额外 作者 Alex Angas,

我相信您可以使用“管理内容和结构”页面(网站操作)执行批量检入。

1
额外
我从页面“管理内容和结构”中尝试了相当长的一段时间,但无法找到答案。感谢您分享步骤。
额外 作者 engtech,

Jaap's answer above is right on target. Once you get into the Manage Content and Structure module, you need to navigate through the explorer-like view to the Library where the pages/documents are housed (will show in the right-pane). Once there, mark the checkboxes next to the ones you need to publish/check-in then go up to the action bar above and choose Actions-->Check-In. This will force a check-in of the content. Doing this is especially helpful for those users who bulk upload new documents through the Windows Explorer method and don't want to check-in each document one-by-one.

正如Alex指出的那样,唯一要做的就是SharePoint有时会'忽略'你的请求,因为有必要的元数据列必须在它们签入之前被填写。您必须更新这些值,然后执行上述批量签入步骤。

1
额外
我只是指它们存储在其中的库可能具有创建的列,需要输入文本或从下拉列表中进行选择,然后才能登录。这些列可能是站点列或由管理员为此列表创建的。
额外 作者 Daniel Broekman,
很酷,谢谢你!
额外 作者 engtech,
“有必要的元数据列必须在可以检入之前填写” - 您是指什么列?
额外 作者 engtech,

您几乎肯定不会将会话cookie延长到很长时间。

虽然没有专门处理铁轨这篇文章花了一些时间来解释'记住我'最佳实践。

总之,尽管你应该:

  • 在用户表中添加一个额外的列以接受一个大的随机值
  • 在客户端设置一个长期存在的cookie,它将用户ID和随机值组合在一起
  • 新会话开始时,请检查id / value Cookie的存在,并在新用户匹配时对其进行身份验证。

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

作为最后一点,他给出的有关使某些功能(密码更改/电子邮件更改等)无法用于自动验证会话的建议非常值得关注,但在现实世界中很少见到。

0
额外
这个答案是误导性的。持久会话是安全的,因为Rails提供的签名cookie是安全的。只有一个理由使用本答案中建议的方法,即“最终说明”:此方法有助于区分手动和自动(通过“记住我”cookie)身份验证。
额外 作者 collimarco,
我想出了一个基于这个解决方案的解决方案。我不是使用新列,而是使用 Digest :: SHA512.base64digest(user.password_digest)作为我的令牌。 password_digest 已经是一个受保护的值,但SHA512会对它进行更多的保护。然后,我将user_id存储在服务器端的会话中,这样我只需要在每个会话中计算一次SHA512。密码更改后这将失效。
额外 作者 bradlis7,
jaspan.com/improved_persistent_login_cookie_best_practice 上查看建议文章的改进,其中增加了“系列”概念更好的安全性您的描述也不准确:1)您的文章的作者建议在用户和Cookie之间建立一对多映射表,以避免在切换计算机(即工作和家庭)时不断使您的登录失效2)无效的随机cookie不会导致你所描述的(两台电脑的问题)
额外 作者 cherouvim,

我会为Devise寻找一个杰出的导轨认证解决方案。

0
额外

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

这是我所做的:

  • Session cookie is set to be long-lived (6 months or so)
  • Inside the session store
    • An 'expires on' date that is set to login + 24 hours
    • user id
    • Authenticated = true so I can allow for anonymous user sesssions (not dangerous because of the cookie tamper protection)
  • I add a before_filter in the Application Controller that checks the 'expires on' part of the session.

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

0
额外
默认情况下,Rails会话cookie仅仅是浏览器会话,因此当浏览器关闭时cookie会被删除。你如何在你的解决方案中做到第一步,你使用的是什么版本的Rails? “会话Cookie设置为长期(6个月左右)”
额外 作者 Nick,
我更改了默认设置,使会话cookie不是“仅浏览器会话”。这个答案是4年前的形式,配置/默认可能不适用于较新版本的Rails。
额外 作者 Daniel Beardsley,

这是一个创建30天持续性会话的经验的相当好的写作。

警告:博客帖子是从2006年开始的

http://grahamglass.blogs.com/main/2006/05/rails_sessionsr。 HTML

0
额外

restful_authentication插件有很好的实现:

http://agilewebdevelopment.com/plugins/restful_authentication

0
额外

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

0
额外

我建议你或者看一下RESTful_Authentication插件,它具有这个实现,或者只是将你的实现切换到使用RESTful Authentication_plugin。关于如何在Railscasts中使用这个插件有一个很好的解释:

railscasts#67 restful_authentication

这是一个链接到插件本身

restful_authentication

0
额外

这对我来说就像一个魅力:

http://squarewheel.wordpress.com / 2007/11/03 /会话cookie的到期时间,在护栏/

现在我的CookieStore会话在两周后过期,用户必须再次提交登录凭据才能持续登录两周。

基本上,它就像下面这样简单:

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