【问题标题】:How to use cookies in a Rack middleware?如何在 Rack 中间件中使用 cookie?
【发布时间】:2011-07-17 14:59:29
【问题描述】:

我正在使用 Ruby on Rails 3,我想在 Rack 中间件中使用 cookies.signed 方法。我需要它,因为我想直接在中间件中对用户进行身份验证,而不是在 application_controller.rb 文件中使用 before_filter。

例如,如果我以这种方式在控制器中使用该方法:

cookies.signed[:user_id']

我明白了

--- 
- 1 # This is the id of the current signed in user
- a64ee3asdtjhcc7b35fcb280956be00ba27f94d48dfe4291c06db7d57577d5893 # This is the cookie salt

但如果我以这种方式在(同一应用程序的)机架中间件中使用它:

request = Rack::Request.new(env)
request.cookies.signed[:user_id']

我明白了

NoMethodError
undefined method `signed' for #<Hash:0x00000103333d40>

那么,如何才能在中间件中使用该方法?如何获取用户 ID 以便进行身份验证?


也许我必须包括\扩展,例如,ActionDispatch...如果是这样,如何?

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 cookies rack


    【解决方案1】:

    看起来你应该能够做到这一点:

      request = ActionDispatch::Request.new(env)
      request.cookie_jar.signed[:user_id] #=> 1
    

    您可以查看 github 上的 .../action_dispatch/middleware/cookies.rb 以详细了解正在发生的事情。

    【讨论】:

    • 这为我指明了正确的方向,但仍然引发了同样的错误(使用 Rails 4.2.7)。问题是env 中缺少应用程序机密。用以下内容替换第一行:ActionDispatch::Request.new(Rails.application.env_config.merge(env)).
    【解决方案2】:

    env 哈希中存在一个已经初始化的 cookie jar。

    env['action_dispatch.cookies'].signed[:user_id]
    

    上面的例子相当于在ActionController::Base实例上下文中调用下面的例子:

    cookies.signed[:user_id]
    

    【讨论】:

    • 很遗憾,env['action_dispatch.cookies'] 不适用于任何机架应用程序。它仅在请求处理的后期设置。
    猜你喜欢
    • 2011-07-17
    • 2013-07-04
    • 2012-11-14
    • 1970-01-01
    • 2012-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多