Rails 如何使用内存中的 SessionStore

Rails how to use an in Memory SessionStore

我正在寻找一种在 Rails 应用程序的 Ruby 中使用基于内存的会话存储的方法。该会话包含一个主密钥,只有在用户登录时才能解密。该密钥在整个会话期间都应该可用。

由于此密钥的性质,会话的内容不应存储在本地任何地方。我也不想将内容传输到任何外部应用程序,例如 memcached。

因此是否可以仅使用类似于 PHP 或 Java SE 的基于内存的会话存储?

您可以使用 CacheStore 来存储会话数据 in-memory。

# /config/initializers/session_store.rb
AppName::Application.config.session_store :cache_store

或者您可以自己编写 SessionStore class:

http://guides.rubyonrails.org/configuring.html#rails-general-configuration

您可以使用 MemoryStore,但这是一个非常糟糕的做法,因为它不在机器之间共享,因此您的应用程序将无法扩展。
从安全的角度来看,没有理由不将此密钥传输到外部 memcached 或 redis。
你应该保护你的生产基础设施作为一个整体,加密你的服务器之间的任何数据交换,或者将它们放在一个可信的网络中,充分利用防火墙并遵循最佳实践。您的缓存服务器应该与您的应用程序服务器或数据库一样安全,没有任何借口。

Rails 5

从版本 5 开始,Rails 不再在安装时创建 config/initializers/session_store.rb 文件。

在 rails 5 中,默认会话存储是在内部设置的(到 cookie 存储),不再像 Rails 4 那样通过应用程序初始化程序设置。 比照。 https://github.com/rails/rails/issues/25181

在纯 Rails 5 应用程序(= 未迁移)中,更改您的 session store,例如从:cookie_store:cache_store,你必须自己创建config/initializers/session_store.rb文件,然后添加相关指令:

# Be sure to restart your server when you modify this file.
Rails.application.config.session_store :cache_store, key: '_your_app_session'

请注意,您需要将密钥从 '_your_app_session' 更改为匹配您的应用程序名称(如果您的应用程序名为 calculator,则应为 '_calculator_session')...