访问Sinatra Middleware中的会话

时间:2012-02-02 13:29:25

标签: ruby session sinatra rack warden

我正在研究Sinatra项目,并在会话中设置了一些变量供以后使用。

我需要帮助的场景是我想访问中间件类中的会话对象。我正在使用warden进行身份验证。

我想在Middleware类中执行类似的操作:

class MyMiddleware
    def initialize(app, options={})
        @app = app
    end

    def call(env)
        puts "#{session.inspect}" 
    end
end

是否有可能这样做?

思想?

2 个答案:

答案 0 :(得分:8)

您不能在Rack中间件中使用Sinatra的session方法,但您可以通过env哈希直接访问会话。

确保会话中间件位于中间件之前(因此Sinatra enable :sessions应该在use MyMiddleware之前),然后通过密钥'rack.session'提供会话:

class MyMiddleware
  def initialize(app, options={})
    @app = app
  end

  def call(env)
    puts env['rack.session'].inspect
    @app.call(env)
  end
end

您可能更喜欢使用Rack::Request对象来更轻松地访问会话以及env哈希的其他部分:

def call(env)
  request = Rack::Request.new(env)
  puts request.session.inspect
  # other uses of request without needing to know what keys of env you need
  @app.call(env)
end

答案 1 :(得分:0)

对我来说,matt 的回答有效,但我必须确保我在 sinatra 中的 use 语句的顺序正确。 cookie 声明必须在我的中间件之前:

class ApiDocs < Sinatra::Base

use Rack::Session::Cookie, ... #etc
use MyMiddleware # my middleware that uses session