Rails 会议当前实践

Posted

技术标签:

【中文标题】Rails 会议当前实践【英文标题】:Rails sessions current practices 【发布时间】:2011-02-05 00:07:17 【问题描述】:

有人对 Rails 和会话有任何“最佳实践”提示吗? Rails 3 的默认会话类型仍然是 CookieStore,对吧?我使用了一段时间的 SqlSessionStore,它运行良好,但我可能会放弃它,转而使用 CookieStore。

将 CookieStore 用于敏感信息是否仍然不是一个好主意,即使是加盐信息,还是更好地存储在数据库中?

【问题讨论】:

另外,目前关于使用 Memcached 进行会话存储的想法是什么? 相关:rails 4.0, rake db:sessions:create. 【参考方案1】:

Rails 4 中默认对 Cookie 进行加密

在 Rails 4 中,CookieStore cookie 默认被加密和签名:

如果您只设置了secret_token,您的 cookie 将被签名,但不会 加密。这意味着用户无法在不知道您的情况下更改其user_id 应用程序的密钥,但可以轻松读取其user_id。这是默认设置 用于 Rails 3 应用程序。

如果您设置了secret_key_base,您的 cookie 将被加密。这是一个 比签名 cookie 更进一步,因为加密的 cookie 无法更改 或被用户阅读。这是从 Rails 4 开始的默认设置。

如果您同时设置了 secret_tokensecret_key_base,您的 cookie 将 被加密,Rails 3 生成的签名 cookie 将是透明的 读取和加密以提供顺畅的升级路径。

Rails 4 不推荐使用 Active Record 会话存储

This answer 现在在 Rails 4 中已经过时了。Active Record 会话存储已被弃用并从 Rails 中删除,因此以下 生成器将不再工作:

rake db:sessions:create

rails generate session_migration

this answer 中指出了这一点。 Active Record 的原因 会话存储被弃用是因为对数据库的读/写操作不 当您有大量用户访问您的应用程序时,可以很好地扩展,例如 在this blog post中声明:

...Active Record 会话存储的一个主要问题是它不是 可扩展的。它会给您的数据库带来不必要的负担。一旦你的申请 接收大量流量,sessions数据库表为 不断地被读/写操作轰炸。

从 Rails 4 开始,Active Record 会话存储已从核心中删除 框架,现已弃用。

如果您仍想使用 Active Record 会话存储,it's still available as a gem。

当前 Rails 会话最佳实践

有关 Ruby on Rails 会话的更多当前最佳实践,我建议您 查看Ruby on Rails Security Guide 的最新版本。

【讨论】:

【参考方案2】:

Rails 默认设置对我来说似乎相当不错 - CookieStore 速度很快,应该涵盖大多数用例。当然你被限制在 4kb 并且你的数据对用户是可见的,但是 Rails 的方式是只使用 session 来处理整数 ID 和基本字符串值之类的东西——如果你试图在 session 中存储对象或高度机密的信息你可能做错了。

【讨论】:

【参考方案3】:

FWIW,rails 3.1 建议运行

rails generate session_migration

但是,这会产生与

完全相同的迁移
rake db:sessions:create

【讨论】:

同样,rake 任务db:sessions:create 现在直接调用session_migration 生成器。任务 :create => :environment 会引发“此数据库无法使用任务(不支持迁移)”,除非 ActiveRecord::Base.connection.supports_migrations?需要'rails/generators' Rails::Generators.configure!需要'rails/generators/rails/session_migration/session_migration_generator' Rails::Generators::SessionMigrationGenerator.start [ ENV["MIGRATION"] || “add_sessions_table”] 结束 rake db:sessions:createrails generate session_migration 生成器在 Rails 4 中已被弃用和删除,因为它们不能很好地适用于具有大量用户的应用程序(数据库读取和写入过多)。见rails 4.0, rake db:sessions:create。【参考方案4】:

将数据库用于会话而不是基于 cookie 的默认值,它不应该用于存储高度机密的信息

创建会话表

rake db:sessions:create

运行迁移

rake db:migrate

确保你也告诉 Rails 也使用 ActiveRecord 来管理你的会话。

导轨 3

config/initializers/session_store.rb:

Rails.application.config.session_store :active_record_store

导轨 2

config/environment.rb:

config.action_controller.session_store = :active_record_store

【讨论】:

我上次听说 ARstore 的会话速度非常慢。有人知道基准吗? 如果您观察会话表的增长并设置一个作业来相应地修剪它,您将不会遇到性能问题。 这是否与设计冲突? 在这里,Rails 3.2,它类似于 TheNameOfMyApplication::Application.config.session_store :active_record_store rake db:sessions:create 在 Rails 4 中已被弃用和删除,因为它不能很好地适用于具有大量用户的应用程序(数据库读取和写入过多)。见rails 4.0, rake db:sessions:create。【参考方案5】:

我认为任何平台上的任何人处理基于 cookie 的会话的方式都没有发生任何变化。对超出服务器控制范围的任何内容(cookie、表单帖子等)持怀疑态度。这是 Web 开发的一般原则。

就加密而言,我不知道这方面是否有任何变化。

使用 cookie 存储需要注意的一点是数据量的限制,以及在每个请求中都会通过网络发送这些数据的问题,而数据库存储仅传输 id 和数据在服务器上。

【讨论】:

以上是关于Rails 会议当前实践的主要内容,如果未能解决你的问题,请参考以下文章

根据当前 Rails.env 配置变量

Rails 3:如何获取当前布局的名称?

Rails - 显示随机记录但不显示当前记录

2022-06-09:每个会议给定开始和结束时间, 后面的会议如果跟前面的会议有任何冲突,完全取消冲突的之前的会议,安排当前的。 给定一个会议数组,返回安排的会议列表。 来自通维数码。

Rails 方法返回当前的“controller#action”?

Rails 一直告诉我它当前没有安装