Как использовать пользовательский сериализатор сеансов cookie в Rack? - PullRequest
2 голосов
/ 29 декабря 2010

В настоящее время я интегрирую Warden в новое приложение Rack, которое я создаю. Я хотел бы реализовать недавний патч для Rack, который позволяет мне указать, как сеансы сериализуются; в частности, я хотел бы использовать Rack::Session::Cookie::Identity в качестве процессора сеанса.

К сожалению, в документации немного неясно, какой синтаксис я должен использовать для настройки 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 для управления своими гем-зависимостями, и я также включил основную ветку стойки в качестве желаемой версии.

Обновление: Как предлагается в комментариях ниже, я прочитал документацию ; к сожалению, предлагаемый синтаксис в документации не работает.

Обновление: Все еще не повезло с моей стороны; предлагая щедрость тому, кто может помочь мне понять это.

Ответы [ 2 ]

3 голосов
/ 01 января 2011
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 голос
/ 29 декабря 2010

Если вы проверяете документацию 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'
...