我有一个Rails-API应用程序.或多或少"开箱即用",但我想添加回基于cookie的会话存储.这就是我所做的:
应用程序/控制器/ application_controller.rb
+ include ::ActionController::Cookies
Run Code Online (Sandbox Code Playgroud)
配置/ application.rb中
+ config.middleware.insert_after ActiveRecord::QueryCache, ActionDispatch::Cookies
+ config.middleware.insert_after ActionDispatch::Cookies, ActionDispatch::Session::CookieStore
Run Code Online (Sandbox Code Playgroud)
创建了config/initializers/secret_token.rb
+ Namespace::Application.config.secret_token = 'token'
Run Code Online (Sandbox Code Playgroud)
创建了config/initializers/session_store.rb
+ Namespace::Application.config.session_store :cookie_store, :key => '_namespace_key'
Run Code Online (Sandbox Code Playgroud)
当我在控制器中检查会话时,它会导致:
<Rack::Session::Abstract::SessionHash:0x3fdadc5daa24 not yet loaded>
Run Code Online (Sandbox Code Playgroud)
但是看起来确实正在写入和使用数据.
但是,在我的浏览器中,cookie本身被命名为'_session_id',而不是'_namespace_key'
我以为我添加了基于cookie的会话存储所需的每一件,但我似乎缺少别的东西.有任何想法吗?
jst*_*nno 39
如果你on 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'
Run Code Online (Sandbox Code Playgroud)
当您想要api-only
启用rails 应用但必须使用ActiveAdmin或Rails_Admin等管理面板管理用户会话时,这可能会派上用场.
Mau*_*res 13
您需要从application.rb
文件中删除这些中间件声明并添加以下内容:
config.api_only = false
Run Code Online (Sandbox Code Playgroud)
如果session_store
初始化程序中有某个位置(您有),则可以按照您的方式启用会话管理.这没有明确记录,但这就是你应该做的.
这里的例子.
忽略此行,因为您没有使用完整的Rails堆栈:
::Rails.application.config.session_store :cookie_store,
:key => '_namespace_key'
Run Code Online (Sandbox Code Playgroud)
因此,您的会话使用此处设置的默认会话密钥.但是,您可以通过替换来直接传递这些参数:
config.middleware.insert_after
ActionDispatch::Cookies, ActionDispatch::Session::CookieStore
Run Code Online (Sandbox Code Playgroud)
有:
config.middleware.insert_after
ActionDispatch::Cookies, ActionDispatch::Session::CookieStore,
:key => '_namespace_key'
Run Code Online (Sandbox Code Playgroud)
这里是您可以传递的完整选项列表(大致了解它们的默认值,因为有些可能被Rails中的模块覆盖).
这在 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)
Run Code Online (Sandbox Code Playgroud)
如果要设置自定义键(是的,必须设置两次):
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')
Run Code Online (Sandbox Code Playgroud)
最后,如果您想添加到期日期 - 在这里完成:
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')
Run Code Online (Sandbox Code Playgroud)
本来希望链接到文档,但没有。