38

我有一个 Rails-API 应用程序。或多或少“开箱即用”,但我想添加回基于 cookie 的会话存储。这是我所做的:

应用程序/控制器/application_controller.rb

+ include ::ActionController::Cookies

配置/应用程序.rb

+ config.middleware.insert_after ActiveRecord::QueryCache, ActionDispatch::Cookies
+ config.middleware.insert_after ActionDispatch::Cookies, ActionDispatch::Session::CookieStore

创建 config/initializers/secret_token.rb

+ Namespace::Application.config.secret_token = 'token'

创建 config/initializers/session_store.rb

+ Namespace::Application.config.session_store :cookie_store, :key => '_namespace_key'

当我在控制器中检查会话时,结果是:

<Rack::Session::Abstract::SessionHash:0x3fdadc5daa24 not yet loaded>

但是,似乎正在写入和使用数据。

但是,在我的浏览器中,cookie 本身被命名为 '_session_id' 而不是 '_namespace_key'

我以为我添加了基于 cookie 的会话存储所需的每一部分,但我似乎遗漏了其他东西。有任何想法吗?

4

4 回答 4

51

如果您在 Rails 5 上,并且想要保留config.api_only = true您可以扩展中间件以添加会话层,在之后添加此class Application < Rails::Application代码config/application.rb

config.middleware.use ActionDispatch::Cookies
config.middleware.use ActionDispatch::Session::CookieStore, key: '_namespace_key'

当您想要api-only启用 Rails 的应用程序但必须使用 ActiveAdmin 或 Rails_Admin 等管理面板管理用户会话时,这可能会派上用场。

于 2016-05-10T13:36:49.707 回答
9

您需要从application.rb文件中删除这些中间件声明并添加:

config.api_only = false

session_store如果您的初始化程序(您拥有)中的某处配置了一个,这将按照您想要的方式启用会话管理。这没有明确记录,但这是你应该做的

这里的例子。

于 2013-03-12T14:04:09.743 回答
8

此行被忽略,因为您没有使用完整的 Rails 堆栈:

::Rails.application.config.session_store :cookie_store,
  :key => '_namespace_key'

因此,您的会话将使用此处设置的默认会话密钥。但是,您可以通过替换直接传递这些参数:

config.middleware.insert_after 
  ActionDispatch::Cookies, ActionDispatch::Session::CookieStore

和:

config.middleware.insert_after
  ActionDispatch::Cookies, ActionDispatch::Session::CookieStore,
  :key => '_namespace_key'

这是您可以传递的选项的完整列表(大致了解它们的默认值,因为某些可能会被 Rails 中的模块覆盖)。

于 2015-04-13T16:59:38.120 回答
8

这在 Rails 6.0 中对我有用,application.rb

config.middleware.use ActionDispatch::Cookies
config.middleware.use ActionDispatch::Session::CookieStore
config.middleware.insert_after(ActionDispatch::Cookies, ActionDispatch::Session::CookieStore)

如果要设置自定义键(是的,必须设置两次):

config.middleware.use ActionDispatch::Cookies
config.middleware.use ActionDispatch::Session::CookieStore, key: '_your_app'
config.middleware.insert_after(ActionDispatch::Cookies, ActionDispatch::Session::CookieStore, key: '_your_app')

最后,如果您想添加到期日期 - 在这里完成:

config.middleware.use ActionDispatch::Cookies
config.middleware.use ActionDispatch::Session::CookieStore, key: '_your_app', expire_after: 20.years 
config.middleware.insert_after(ActionDispatch::Cookies, ActionDispatch::Session::CookieStore, key: '_your_app')

本来喜欢链接到文档,但没有。

于 2020-04-15T21:25:30.923 回答