Sinatra应用程序共享会话值?

问题描述:

我有一个主Controlller:Sinatra应用程序共享会话值?

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

和我有几个其他控制器从MainController继承和拥有地图配置上config.ru

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 ::主要我有以下的功能,我从AppController的

def authenticated? 
    session[:admin] 
end 

上AuthController我可以改变会话路由模板使用[:管理员],但是当我试图访问会话[:管理]在使用认证的模板上?功能它只是返回,因为它没有改变。我的问题是:sinatra会话通过应用程序共享值?

我的问题是:[sinatra会话通过应用程序共享值?

是的,会话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的安全性。

+0

谢谢@iain。当我看到[这个问题](http://stackoverflow.com/questions/18844863/sinatra-clears-session-on-post)和它的答案我可以解决这个问题。 –