2009-03-19 11 views
5

Ich habe einen 2.2.3-App, die ichLosing Sitzung in Schienen 2.3.2 App Sub-Domain mit

Es ist eine Multi-Site (mit Sub-Domain) auf 2.3.2 aktualisiert, die eine Top-Level-Session für alle Standorte erstellt.

Dies ist, wie ich die Domain in production.rb ändern:

ActionController::Base.session_options[:domain] = "example.com" 

# in rails 2.2.2, this is what i used to do: 
# ActionController::Base.session_options[:session_domain] = "example.com" 

Seltsame Dinge begannen zu geschehen, nachdem ich ich nicht mehr in Verwendung erholsame Authentifizierung anmelden kann aufgerüstet; Es authentifiziert mich, aber sobald ich umgeleitet werde, würde es mich bitten, mich erneut anzumelden.

Wie gesagt, ich benutze restful_authentication und benutze auch Passagier 2.1.2. Kann jemand helfen?

+0

Ist die Antwort richtig ist Vlad eingestellt werden hinzugefügt? – MickaelFM

Antwort

1

Sie müssen angeben:

.example.com 

(beachten Sie die führenden Punkt), um die Session-Cookie zu example.com sowie deren Subdomains anzuwenden.

-1

Ich hatte das gleiche Problem mit Cookie-basierten Sitzungen. Das Upgrade auf Passenger 2.1.3 schien das Problem zu beheben.

+0

Dies ist ein anderes Problem –

0

hatten wir das gleiche Problem (Sitzungen verlieren, ohne Subdomain), mit Nginx + dünn. Migrieren zu Apache + Passagier (letzte Version) behob das Problem.

3

In Rails 2.3 sollten Sie

config.action_controller.session[:domain] = '.example.com' 
+0

Ich habe versucht, dies in development.rb und habe: undefined Methode '[] = 'für Null: NilClass –

+0

Ahh! Herausgefunden. Die Sitzungsvariable wurde noch nicht erstellt. Das hat funktioniert: config.action_controller.session = {: domain => '.example.com'} –

7

Olly Antwort ist richtig, in Schienen 2.3 es sein sollte:

config.action_controller.session[:domain] = '.example.com' 

Ich wollte nur hinzufügen, dass, wenn Sie nicht bereits einige haben noch Sitzungsoptionen erstellt Sie diese erhalten können, wenn die Verwendung dieser:

undefined method `[]=' for nil:NilClass 

In diesem Fall sollten Sie dieses i verwenden nstead (die die Session-Variablen es statt der Aktualisierung erstellt):

config.action_controller.session ||= {} 
config.action_controller.session[:domain] = '.example.com' 

Edit: anscheinend Rails 2.2.2 Projekte etwas anderes verwenden. "domain" sollte "session_domain" heißen und das periodische Zeichen von der Vorderseite der Domain nehmen. Versuchen Sie dies:

config.action_controller.session ||= {} 
config.action_controller.session[:session_domain] = 'example.com' 
+0

Awesome, bekam diesen genauen Fehler und kann jetzt beheben: D – nitecoder

+0

Dies war hilfreich für mich, sichere Sitzungen festzulegen. – anonmys

1

Ich wollte nur erwähnen, dass eine andere Möglichkeit, die ganze Subdomain Sache für die Cookies ist dynamisch zu behandeln. Funktioniert in 2.3.4.

So etwas wie dies in den environment.rb

# solution to use the cookies in the api. domains 
# this is relevant but in 2.3.4 the code is different 
# http://szeryf.wordpress.com/2008/01/21/cookie-handling-in-multi-domain-applications-in-ruby-on-rails/ 
# Just making sure that api. shares the domain name 
require 'dispatcher' 
module ActionController 
    class Dispatcher 
    def set_session_domain 
     host_name = @env['SERVER_NAME'] 
     new_host_name = whatever #some mod of the host_name, for instance 
     ActionController::Base.session = { 
     :domain => new_host_name 
     } 
    end 

    before_dispatch :set_session_domain 
    end 
end 
1

Ich bin mit Rails 2.3.5 und

config.action_controller.session = {:domain => '.localhost:3000'} 

in meinem development.rb habe, aber ich es nicht an der Arbeit ?

Noch etwas, was Sie tun müssen?

2

Eine kugelsicherere Lösung wäre es zu überprüfen, ob die Sitzung bereits existiert oder nicht. Wenn Sie das gesamte Sitzungsobjekt blind austauschen, kann es Sie in der Zukunft stolpern.

if ActionController::Base.session 
    ActionController::Base.session[:domain] = '.example.com' 
else 
    ActionController::Base.session = { :domain => '.example.com' } 
end 

Ich möchte dies in einer Initialisierungsdatei tun.

0

Ich bin auch 2.3.5 und Begegnung mit ähnlichen Problemen zu @ alfred-Nerstu

keine Fehlermeldungen mit dem Patch von @schickm läuft, aber es scheint nicht, entweder zu nehmen.

0

Es könnte an der gleichen Stelle, wo man den Sitzungsschlüssel und geheimen

config.action_controller.session = { 
     :key => '_app_session', 
     :domain => '.domain.com', 
     :secret => 'secret' 
}