ruby-on-rails 将Cookie会话存储添加回Rails API应用程序

fhity93d  于 2022-12-15  发布在  Ruby
关注(0)|答案(5)|浏览(97)

我有一个Rails-API应用程序。或多或少“开箱即用”,但我想添加回基于cookie的会话存储。以下是我所做的:
应用程序/控制器/应用程序_控制器.rb

+ include ::ActionController::Cookies

配置/应用程序.rb

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

创建配置/初始化器/secret_token.rb

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

创建的配置/初始化程序/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的会话存储所需的每一部分,但我似乎遗漏了一些其他的东西。

eaf3rand

eaf3rand1#

如果您使用的是Rails5,并且希望保留config.api_only = true,则可以扩展中间件以添加会话层,将此代码添加到config/application.rb中的class Application < Rails::Application之后

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

当您希望拥有一个支持rails api-only的应用程序,但必须使用ActiveAdmin或Rails_Admin等管理面板来管理用户会话时,这可能会派上用场。

ghhaqwfi

ghhaqwfi2#

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

config.api_only = false

如果在你的初始化器中有一个已配置的session_store(你已经有了),这将以你想要的方式启用会话管理。这没有明确的文档,但这是你应该做的。
例如here

fnx2tebb

fnx2tebb3#

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

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

bgibtngc

bgibtngc4#

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

eit6fx6z

eit6fx6z5#

这个线程对我来说很神奇,我在Rails "7.0.4"Ruby "3.1.2"

config.session_store :cookie_store, key: '_interslice_session'
config.middleware.use ActionDispatch::Cookies
config.middleware.use config.session_store, config.session_options

下面是用户.rb

class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :jwt_authenticatable, :registerable,
  :recoverable, :rememberable, :validatable, :confirmable, :lockable, 
  :timeoutable, :trackable, jwt_revocation_strategy: JwtDenylist
end

相关问题