Синатра и переменные сеанса, которые не устанавливаются - PullRequest
11 голосов
/ 12 апреля 2011

По какой-то причине переменные сеанса не устанавливаются в моем приложении.Я использую Sinatra 1.2.1.

Вот фрагмент кода:

module GitWiki
  class App < Sinatra::Base

    configure do
      enable :sessions

      set :app_file, __FILE__
      set :root, File.expand_path(File.join(File.dirname(__FILE__), '..', '..'))

      set :auth do |bool|
        condition do
          redirect '/login' unless logged_in?
        end
      end
    end

    helpers do
      def logged_in?
        not @user.nil?
      end
    end

    error PageNotFound do
      page = request.env["sinatra.error"].name
      redirect "/#{page}/edit"
    end

    before do
      content_type "text/html", :charset => "utf-8"
      @user = session[:user]
    end

    get "/login/?" do
      erb :login
    end

    post "/login" do
      user = User.get
      if user.authenticate(params[:username], params[:password])
        session[:user] = params[:username]
        p session # => {:user=>"root"}
      else
        # AZIZ!  LIGHT!
      end

      redirect '/'
    end

    get "/" do
      p session # => {}
      redirect "/" + GitWiki.homepage
    end

    # ... 
  end
end

Как видите, session[:user] не устанавливается, или, скорее, хэш сеансасброс после каждого запроса.Кто-нибудь знает, что происходит, пожалуйста?

1 Ответ

26 голосов
/ 15 апреля 2011

Если вы используете дробовик, добавьте следующую строку в блок настройки:

set :session_secret, "My session secret"

Чтобы процитировать от rkh, текущий сопровождающий Синатры:

[Дробовик] будетперезапускайте сервер при каждом запросе, восстанавливая таким образом секрет сеанса и, таким образом, лишайте законной силы ваши сеансы.Это было исправлено в текущем мастере.Простое исправление: установите параметр session_secret.

ПРИМЕЧАНИЕ : это исправление не работает, если вы используете Rack::Session::Pool

...