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_token
和secret_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:create
和 rails 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_storerake db:sessions:create
在 Rails 4 中已被弃用和删除,因为它不能很好地适用于具有大量用户的应用程序(数据库读取和写入过多)。见rails 4.0, rake db:sessions:create。【参考方案5】:
我认为任何平台上的任何人处理基于 cookie 的会话的方式都没有发生任何变化。对超出服务器控制范围的任何内容(cookie、表单帖子等)持怀疑态度。这是 Web 开发的一般原则。
就加密而言,我不知道这方面是否有任何变化。
使用 cookie 存储需要注意的一点是数据量的限制,以及在每个请求中都会通过网络发送这些数据的问题,而数据库存储仅传输 id 和数据在服务器上。
【讨论】:
以上是关于Rails 会议当前实践的主要内容,如果未能解决你的问题,请参考以下文章
2022-06-09:每个会议给定开始和结束时间, 后面的会议如果跟前面的会议有任何冲突,完全取消冲突的之前的会议,安排当前的。 给定一个会议数组,返回安排的会议列表。 来自通维数码。