【问题标题】:Rails 3: Storing Session in Active Record (not cookie)Rails 3:在 Active Record 中存储会话(不是 cookie)
【发布时间】:2019-04-14 11:05:53
【问题描述】:

我在谷歌大学搜索了大约一个小时左右,但没有关于这个主题的单一好的文档:-( 希望有人能提供帮助。我愿意买一本书,只要有人能告诉我哪一个。

我正在使用以下版本:

  • 导轨 3.2.6,
  • ruby 1.9.3p194(2012-04-20 修订版 35410)[x86_64-darwin11.4.0]

要开始在 Active Record 中使用会话存储而不是 cookie,我做了以下操作:

  1. 更新config/initializers/session_store.rb注释了第一行,取消注释了最后一行,所以我有:

    # Be sure to restart your server when you modify this file.
    
    # Myapp::Application.config.session_store :cookie_store, key: '_elegato_session'
    
    # Use the database for sessions instead of the cookie-based default,
    # which shouldn't be used to store highly confidential information
    # (create the session table with "rails generate session_migration")
    Myapp::Application.config.session_store :active_record_store
    
  2. rake db:sessions:create

    invoke  active_record
      create    db/migrate/20120729025112_add_sessions_table.rb
    
  3. rake db:migrate

    ==  CreateLinkedinUsers: migrating ============================================
    -- create_table(:linkedin_users)
      -> 0.0236s
    ==  CreateLinkedinUsers: migrated (0.0237s) ===================================
    
    ==  AddSessionsTable: migrating ===============================================
    -- create_table(:sessions)
      -> 0.0012s
    -- add_index(:sessions, :session_id)
      -> 0.0006s
    -- add_index(:sessions, :updated_at)
      -> 0.0006s
    ==  AddSessionsTable: migrated (0.0026s) ======================================
    
  4. 为了找出实际创建的表,我打开 sqlite3 文件

    sqlite> .schema sessions
    CREATE TABLE "sessions" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "session_id"   varchar(255) NOT NULL, "data" text, "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL);
    CREATE INDEX "index_sessions_on_session_id" ON "sessions" ("session_id");
    CREATE INDEX "index_sessions_on_updated_at" ON "sessions" ("updated_at");
    

因此,会话表中有一个“数据”字段,它将存储与会话相关的所有内容。

现在,我的问题:-)

我需要在会话中存储 2 个变量的值:access_token 和 request_token。 我可以使用以下吗? (我用来存储 cookie 会话值的方式)

session[:access_token] = <blah>
session[:request_token] = <some other blah?

如果它确实有效,那么 ruby​​ 是否将这两个变量作为数组存储在表的“数据”字段中。

非常感谢您的帮助!

【问题讨论】:

    标签: ruby-on-rails session


    【解决方案1】:

    您的所有会话变量都在会话表的数据列中使用 Base64 进行序列化。如果您使用 cookie 会话存储分配和检索值,您可以像使用它一样使用它。在数据库中存储会话变量有一些很好的好处,比如只在每个请求期间传输 session_id,而不是从 cookie 传输整个会话,通过检查它们的年龄(created_at/updated_at)来管理陈旧或旧会话的能力,以及能够存储比 cookie 中更多的信息。

    您也可以提供自己的 Session 类,查看 SessionStore 类中的文档:https://github.com/rails/rails/blob/5edfc463484827df364a1e589677d5c84dfac282/activerecord/lib/active_record/session_store.rb

    【讨论】:

    • 不足为奇@sjors-branderhorst,因为我的回答已经有一年多了,Rails master 现在是第 4 版。我可能应该抓住标记版本的链接 - 事后诸葛亮事物。 ActiveRecord::SessionStore 已被提取到它自己的 Rails 4 gem 中 - 新链接是 github.com/rails/activerecord-session_store
    • 为了后代,我已更新链接以指向截至评论日期的文件。 :)
    【解决方案2】:

    您通常不必太在意 Rails 如何存储会话,它是透明的。如果您使用 cookie 存储或 ActiveRecord 存储,您的代码不会更改。

    所以是的,你可以做你以前做的事情。从技术上讲,包含会话的序列化字符串存储在data 字段中,但这并不重要:)

    但是我建议使用 cookie 存储,除非您有充分的理由使用 ActiveRecord(会话中的数据超过 4K?)

    【讨论】:

    • 为什么建议使用 cookie 存储?
    • 默认情况下 - 使用 cookie 存储,除非您更改某些内容,否则会话不会过期。这意味着某些默认应用程序可能容易受到重放攻击。这也意味着不应将敏感信息放入会话中。最佳实践是使用基于数据库的会话。见owasp.org/index.php/Ruby_on_Rails_Cheatsheet#Sessions
    • Rails 的默认设置仍然是 cookie 存储,主要原因是速度。您也不必关心数据库大小的增长。也就是说,您必须知道使用它的良好做法。不要在其中存储任何秘密(为什么要这样做?),也不要存储任何序列化对象。只需存储 ID,否则您将很快突破 4K 限制。我同意你的观点,数据库存储在较小的项目上更容易处理。不过,在规模上,cookie 商店的速度要快得多。这个网址:guides.rubyonrails.org/security.html#session-storage 是一个很好的阅读主题。
    猜你喜欢
    • 1970-01-01
    • 2012-08-10
    • 1970-01-01
    • 2013-08-21
    • 1970-01-01
    • 2018-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多