【问题标题】:Adding cookie session store back to Rails API app将 cookie 会话存储添加回 Rails API 应用程序
【发布时间】:2013-02-26 20:57:09
【问题描述】:

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

app/controllers/application_controller.rb

+ include ::ActionController::Cookies

config/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'

创建的配置/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 的会话存储所需的每一部分,但我似乎遗漏了其他东西。有什么想法吗?

【问题讨论】:

  • 我也遇到了同样的问题,你最后把api_only关掉了吗?似乎这不是一个好的解决方案..

标签: ruby-on-rails


【解决方案1】:

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

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

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

【讨论】:

  • 要在 Rails 5 API 应用程序上启用 ActiveAdmin,除了上述步骤之外,您还必须执行一些其他步骤。具体来说,您必须创建 2 个基本控制器,一个用于 ActiveAdmin,它继承自 ActionController::Base,另一个用于 API 控制器,它继承自 ActionController::API。您还需要更多的中间件来渲染仪表板视图。我用所有步骤写了a guide。希望有帮助!
  • 这可能很明显,但config.session_store 在这种情况下不再有用;现在只需要这个config.middleware.use 的东西。此外,key: '_namespace_key' 等选项也应移至config.middleware.use 语句中。
  • 根据Rails issue这个include AbstractController::Helpersinclude ActionController::Cookies在控制器中除了启用中间件可能还需要。
【解决方案2】:

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

config.api_only = false

如果在您的初始化程序(您有)中某处配置了session_store,这将按照您想要的方式启用会话管理。这没有明确记录,but that's what you're supposed to do

例如here

【讨论】:

  • 虽然这可能会解决问题,但这样做并没有任何意义。我使用 rails-api 来保持我的堆栈苗条和修剪。设置config.api_only = false 本质上说只使用常规的完整Rails 堆栈。 ...在这种情况下,使用 rails-api 毫无意义。
  • @turboladen 是对的——这违背了使用 rails-api 的目的。如果您只想包含具有特定选项的特定中间件,那么有一种非常简洁的方法可以做到这一点 - 就像 rails-api 本身一样here
  • 天哪!为这个问题和答案赞美主!经过数小时的跟踪代码,我正准备扼杀自己,试图弄清楚为什么#$%^!它没有使用我的 session_options! ;) 如果人们不想禁用api_only,我将为此答案添加一个替代选项。
  • 好的,我的编辑被拒绝了,我猜是(?),但请参阅下面的@IsaacBetesh 的回答来了解这个想法。我还为 Rails Guides 添加了一个 PR 来解释尝试将会话中间件添加回 Rails api_only 应用程序的特殊情况:github.com/rails/rails/pull/28009
【解决方案3】:

此行被忽略,因为您没有使用完整的 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 中的模块覆盖)。

【讨论】:

    【解决方案4】:

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

    很想链接到文档,但没有。

    【讨论】:

    • 另外,在每个环境文件上单独声明这一点很重要。特别是如果您使用omniauth(取决于在session_store 上设置的域)。
    猜你喜欢
    • 2016-06-16
    • 1970-01-01
    • 1970-01-01
    • 2017-01-09
    • 2017-03-13
    • 1970-01-01
    • 1970-01-01
    • 2018-10-06
    • 2015-06-12
    相关资源
    最近更新 更多