Sinatra应用程序共享会话值?

时间:2015-07-18 21:34:53

标签: ruby session authentication routing sinatra

我有一个主控制器:

class MainController < Sinatra::Base
  set :views, File.expand_path('../../templates', __FILE__)
  enable :sessions
  helpers AppHelper::Main
end

我还有一些其他的控制器继承自MainController并且在config.ru上有自己的路由配置 map

AuthController

class AuthController < MainController
  # Code above
  get_login = lambda do
    redirect '/' if session[:admin]
    erb :login, :layout => false
  end
  get '/login', &get_login
  # Cobe below
end

config.ru

# code above
map('/') { run AppController } # Another inherited controller...
map('/auth') {run AuthController }

在AppHelper :: Main上我有以下函数,我在从AppController路由的模板上使用

def authenticated?
  session[:admin]
end

在AuthController上我可以更改会话[:admin],但是当我尝试在使用已验证?功能的模板上访问会话[:admin]时,它只返回 nil ,因为它没有改变。我的问题是: sinatra会话通过Apps分享价值?

1 个答案:

答案 0 :(得分:1)

  

我的问题是:[确实] sinatra会话通过Apps分享价值?

是的,会话cookie应由具有相同密钥的不同应用共享。

# config.ru
require_relative "app.rb"

map('/') { run AppController } # Another inherited controller...
map('/auth') {run AuthController }

# app.rb
require 'sinatra/base'

class MainController < Sinatra::Base
  #set :views, File.expand_path('../../templates', __FILE__)
  enable :sessions
  #helpers AppHelper::Main

  get '/' do
    "#{self.class.name}: value = " << session[:value].inspect
  end

  get '/:value' do
    session['value'] = params['value']
    "#{self.class.name}: value = " << session[:value].inspect
  end
end

class AuthController < MainController

end

class AppController < MainController

end

使用此功能,我可以访问任一控制器中的数据,无论设置哪一个。我认为你的问题在其他地方。我建议使用encrypted_cookie并在应用程序使用的config.ru中进行设置,这可能会增加Cookie的安全性。