【问题标题】:Rails w/ ActiveRecord Sessions and Restful-authentication: when does the sessions table get written to?Rails w/ ActiveRecord 会话和 Restful-authentication:会话表何时被写入?
【发布时间】:2010-10-28 15:56:52
【问题描述】:

警告:其中一些可能是非常错误的,所以如果我的假设不正确,请告诉我。

这是我想要完成的:

我正在使用 restful-authentication 进行登录。但是,由于我在 UI 中使用 flex/ruby_amf,因此我必须分别对来自 flex 的每个连接进行身份验证。

我决定这样做的方法是将登录屏幕重定向到嵌入式 Flash 页面,将 session-id 作为 flashvar 插入。 Flash 应用会随每个请求发送会话 ID,所有相关控制器上的前置过滤器会检查与会话 ID 标识的会话相关联的用户是否已登录。

我将用户与会话关联的方式是在会话表中添加一个“user_id”列,并执行从登录函数调用的 sql“更新会话集 user_id...”类型查询。

但是,user_id 仅在用户第二次登录时更新。稍作调查表明,在执行登录功能期间,会话表中的记录尚不存在。

所以,如果到目前为止一切都有意义,并且符合最佳实践等,那么我的问题是:

会话表中的记录是在什么时间点创建的?有没有办法在登录函数中更新会话对象并让 Rails 为我将 user_id 写入数据库?

rails 中会话的行为对我来说是一个真正的谜。如有任何帮助,我将不胜感激。

谢谢。

【问题讨论】:

  • PS:我在这里找到了关于更新会话表的讨论:nabble.com/Rails-2.3-Sessions-td22720164.html
  • 好的,我一直在研究这个问题,我认为我一直在做的错误假设之一是会话对象对应于会话表中的一行。我希望我可以执行 session[:user_id] = Users.authenticate(name, pass) 然后执行 session.save 将其写入数据库。实际上(如果我错了,请纠正我!),会话对象以编码形式显示为数据列。这是另一个链接,说我所做的基本上是正确的:scottiestech.info/2009/04/02/…

标签: ruby-on-rails session restful-authentication


【解决方案1】:

在 Rails 2.3 中,会话在 Rack 应用程序完成处理后保存。在传统的 Rails 应用程序中,这将在请求被完全处理之后:过滤器之前、控制器操作、视图呈现和过滤器之后。看actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/session/abstract/id.rb

如果你仔细想想,这完全有道理。每次在会话中放置内容时将会话写入其存储区会产生大量额外开销。

它是 Rails,所以如果你想把它弄得够呛,当然,你可以给自己打个猴子补丁,让自己可以随时编写会话来存储。我不推荐它。随着 Rails 的发展,您最终将不得不不断地修改代码。

你是对的,对于 ActiveRecord::SessionStore,一行确实映射到一个会话。 data 列是您放入会话中的每个对象的编码形式。每次收到请求时,Rails 都必须通过创建您之前存储在其中的所有对象的新实例来重建会话的存在状态。

【讨论】:

    猜你喜欢
    • 2011-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-27
    • 2011-08-11
    • 1970-01-01
    • 1970-01-01
    • 2013-01-29
    相关资源
    最近更新 更多