2009-03-19 3 views
5

J'ai une application 2.2.3 que je surclassé 2.3.2session de perte dans des rails 2.3.2 application en utilisant un sous-domaine

Il est un multi-site (en utilisant un sous-domaine) qui crée une session de haut niveau pour tous les sites.

Voici comment je change le domaine production.rb:

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" 

Des choses étranges ont commencé à se produire après avoir mis à jour je ne peux plus vous connecter en utilisant l'authentification reposant; il m'authentifie, mais dès que je suis redirigé, il me demande de me reconnecter. Comme je l'ai dit, j'utilise restful_authentication et j'utilise également le passager 2.1.2. Quelqu'un peut-il aider?

+0

est correcte la réponse du Vlad? – MickaelFM

Répondre

1

Vous devez indiquer:

.example.com 

(remarquez le point leader) pour que le cookie de session à appliquer à example.com ainsi que ses sous-domaines.

-1

J'ai eu le même problème avec les sessions basées sur les cookies. La mise à niveau vers Passenger 2.1.3 semblait résoudre le problème.

+0

c'est un problème différent –

0

nous avons eu le même problème (perdre des sessions, sans sous-domaine), avec nginx + thin. La migration vers Apache + passager (dernière version) a résolu le problème.

3

Dans Rails 2.3, vous devez utiliser

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

J'ai essayé de mettre cela dans development.rb et j'ai obtenu: undefined la méthode '[] = 'pour nil: NilClass –

+0

Ahh! Deviner. La variable de session n'a pas encore été créée. Cela a fonctionné: config.action_controller.session = {: domain => '.example.com'} –

7

La réponse de Olly est correcte, dans des rails 2.3, il devrait être:

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

Je voulais juste ajouter que si vous ne possédez pas déjà une les options de session créées vous pouvez recevoir ceci en utilisant cela:

undefined method `[]=' for nil:NilClass 

Dans ce cas, vous devez utiliser ce lutôt (qui crée la variable de session au lieu de le mettre à jour):

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

Edit: Rails 2.2.2 apparemment projets utilisent quelque chose de différent. "domain" devrait être nommé "session_domain" et retirer le caractère de période au début du domaine. Essayez ceci:

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

Génial, obtenait cette erreur exacte et maintenant peut résoudre: D – nitecoder

+0

Cela m'a été utile pour définir des sessions sécurisées. – anonmys

1

Je voulais juste mentionner qu'une autre façon de gérer l'ensemble du sous-domaine pour les cookies est dynamiquement. Fonctionne dans 2.3.4.

Quelque chose comme ça dans le 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

Je suis en cours d'exécution Rails 2.3.5 et ont

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

dans mon development.rb, mais je ne suis pas à travailler ?

Quelque chose d'autre que vous devez faire?

2

Une solution plus pare-balles consisterait à vérifier si la session existe déjà ou non. Si vous remplacez aveuglément tout l'objet de la session, il risque de vous trébucher dans le futur.

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

J'aime faire cela dans un fichier d'initialisation.

0

Je suis en cours d'exécution aussi 2.3.5 et rencontrant des problèmes similaires à @ alfred-nerstu

Aucun message d'erreur avec le patch de @schickm, mais il ne semble pas prendre, que ce soit.

0

Il pourrait être ajouté au même endroit où vous définissez la clé de session et secret

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