我有一个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的会话存储所需的每一件,但我似乎缺少别的东西。有什么想法吗?
答案 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')
本来喜欢链接到文档的,但是没有。