将cookie会话存储添加回Rails API应用程序

时间:2013-03-11 15:41:35

标签: ruby-on-rails

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

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

+ include ::ActionController::Cookies

配置/ application.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 个答案:

答案 0 :(得分:36)

如果您使用的是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应用但必须使用管理面板(如ActiveAdmin或Rails_Admin)管理用户会话时,这可能会派上用场。

答案 1 :(得分:13)

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

config.api_only = false

如果您的初始化程序(您拥有)中的某个位置配置了session_store,这将以您希望的方式启用会话管理。这没有明确记录,but that's what you're supposed to do

示例here

答案 2 :(得分:7)

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

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

相反,您的会话使用默认会话密钥set here。但是,您可以通过替换:

直接传递这些参数
config.middleware.insert_after 
  ActionDispatch::Cookies, ActionDispatch::Session::CookieStore

使用:

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

这是a full list of options you can pass(粗略了解它们的默认值,因为有些可能会被Rails中的模块覆盖)。

答案 3 :(得分:3)

这在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')

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