如何在Rack中使用自定义cookie会话序列化程序?

时间:2010-12-29 00:12:58

标签: ruby rack

我目前正在将Warden集成到我正在构建的新Rack应用程序中。我想对Rack实现一个recent patch,允许我指定会话的序列化方式;具体来说,我想使用Rack::Session::Cookie::Identity作为会话处理器。

不幸的是,关于在我的rackup文件中配置Rack::Session::Cookie应使用什么语法的文档有点不清楚,这里的任何人都可以告诉我我做错了吗?

config.ru

require 'my_sinatra_app'

app = self

use Rack::Session::Cookie.new(app, Rack::Session::Cookie::Identity.new), {:key => "auth_token"}

use Warden::Manager do |warden| # Must come AFTER Rack::Session
  warden.default_strategies :password
  warden.failure_app Jelli::Auth.run!
end

run MySinatraApp
来自瘦

错误消息

!! Unexpected error while processing request: undefined method `new' for #<Rack::Session::Cookie:0x00000110124128>

PS:我正在使用bundler管理我的gem依赖项,我同样也将rack的master分支作为所需的版本。

更新:根据以下评论中的建议,我已阅读documentation;遗憾的是,文档中建议的语法不起作用。

更新:我的结局仍然没有运气;向任何可以帮我解决这个问题的人提供赏金。

2 个答案:

答案 0 :(得分:3)

require 'my_sinatra_app'

app = self

session_app = Rack::Session::Cookie.new(app, {
        :coder => Class.new {
                def encode(str); str; end
                def decode(str); str; end
              }.new
      })

use session_app

run MySinatraApp

我查看了源代码,Rack :: Session :: Cookie :: Identity就像:

一样简单
class Identity
  def encode(str); str; end
  def decode(str); str; end
end

那么这应该足够了。我运行它很薄,我得到一个你好世界的应用程序 - 这就是我去的。

答案 1 :(得分:1)

如果您查看Rack :: Session :: Cookie(https://github.com/rack/rack/blob/master/lib/rack/session/cookie.rb

的文档

你可以看到没有初始化方法,它建议使用:

use Rack::Session::Cookie, :key => 'rack.session',
                           :domain => 'foo.com',
                           :path => '/',
                           :expire_after => 2592000,
                           :secret => 'change_me'