J'ai une configuration d'application où chaque utilisateur appartient à une entreprise, et cette entreprise a un sous-domaine (j'utilise des sous-domaines de style basecamp). Le problème auquel je suis confronté est que les rails créent plusieurs cookies (un pour lvh.me et un autre pour subdomain.lvh.me), ce qui provoque de nombreuses interruptions dans mon application (comme les messages flash persistants dans toutes les demandes une fois connecté).
J'ai ceci dans mon fichier /cofig/initilizers/session_store.rb:
AppName::Application.config.session_store :cookie_store, key: '_application_devise_session', domain: :all
Le domaine:: tout semble être la réponse standard que j'ai trouvée sur Google, mais cela ne semble pas fonctionner pour moi. Toute aide est appréciée!
la source
config.secret_key_base
dans toutes vos applications, sinon il ne pourra pas décoder le cookie.CacheStore
pour stocker des sessions dans Memcached?Appname::Application.config.session_store :cookie_store, key: '_appname_session', domain: :all, tld_length: 2
http://excid3.com/blog/sharing-a-devise-user-session-across-subdomains-with-rails-3/
En d'autres termes, vous avez besoin de:
Aussi une bonne idée pour effacer vos cookies
la source
, :tld_length => 2
config.secret_key_base
dans toutes vos applications, sinon il ne pourra pas décoder le cookie.:domain => :all
ne fonctionnera pas dans Rails 4, essayezdomain => 'lvh.me', tld_length = 2
. Cela a fonctionné pour moidomain: :all, tld_length: 2
en utilisant simplement lelvh.me
domaine.Je cherchais un moyen de résoudre ce problème sans avoir à indiquer explicitement le nom de domaine, afin que je puisse sauter entre localhost, lvh.me et tous les domaines que j'utiliserais en production sans avoir à continuer à éditer le fichier session_store.rb. Cependant, la configuration de "domain:: all" ne semblait pas fonctionner pour moi.
En fin de compte, j'ai trouvé que je devais indiquer le tld_length (longueur du domaine de premier niveau) dans cette expression. La valeur par défaut tld_length est 1 tandis que example.lvh.me a une tld_length de 2 et 127.0.0.1.xip.io a une tld_length de 5, par exemple. Donc, ce que j'avais dans le fichier session_store.rb pour les sous-domaines sur lvh.me en développement et tout ce qui était en production était le ci-dessous.
J'espère que cela aide quelqu'un, car il m'a fallu beaucoup de temps pour trouver cette réponse!
la source
Pour une raison quelconque, le remplacement
:all
par le domaine n'a pas fonctionné (rails 3.2.11) pour moi. Il a fallu un morceau de middleware personnalisé pour le réparer. Un résumé de cette solution est ci-dessous.tl; dr: Vous devez écrire un middleware de rack personnalisé. Vous devez l'ajouter dans votre fichier
conifg/environments/[production|development].rb
. C'est sur Rails 3.2.11Les sessions de cookies sont généralement stockées uniquement pour votre domaine de premier niveau.
Si vous regardez dans
Chrome -> Settings -> Show advanced settings… -> Privacy/Content settings… -> All cookies and site data… -> Search {yourdomain.com}
Vous pouvez voir qu'il y aura des entrées séparées poursub1.yourdomain.com
etothersub.yourdomain.com
etyourdomain.com
Le défi consiste à utiliser le même fichier de stockage de session dans tous les sous-domaines.
Étape 1: Ajouter une classe middleware personnalisée
C'est là qu'intervient Rack Middleware . Quelques ressources pertinentes sur les racks et les rails:
Voici une classe personnalisée que vous devriez ajouter dans le
lib
Ceci a été écrit par @Nader et vous devriez tous le remercierEn gros, cela mappera toutes les données de votre session de cookies sur le même fichier de cookies qui est égal à votre domaine racine.
Étape 2: Ajouter à la configuration des rails
Maintenant que vous avez une classe personnalisée dans lib, assurez-vous de la charger automatiquement. Si cela ne vous dit rien, regardez ici: Rails 3 autoload
La première chose à faire est de vous assurer que vous utilisez un magasin de cookies à l'échelle du système. Dans
config/application.rb
nous disons à Rails d'utiliser un magasin de cookies.La raison pour laquelle cela est mentionné ici est à cause de la
:domain => :all
ligne. D'autres personnes ont suggéré de spécifier:domain => ".yourdomain.com"
au lieu de:domain => :all
. Pour une raison quelconque, cela n'a pas fonctionné pour moi et j'avais besoin de la classe Middleware personnalisée comme décrit ci-dessus.Puis dans votre
config/environments/production.rb
ajout:Notez que le point précédent est nécessaire. Voir « cookies de sous-domaine, envoyés dans une demande de domaine parent? » Pour savoir pourquoi.
Puis dans votre
config/environments/development.rb
ajout:L'astuce lvh.me est mappée sur localhost. C'est génial. Voir ce Railscast sur les sous - domaines et cette note pour plus d'informations.
J'espère que cela devrait le faire. Honnêtement, je ne suis pas tout à fait sûr de savoir pourquoi le processus est si compliqué, car je pense que les sites de sous-domaines croisés sont courants. Si quelqu'un a d'autres informations sur les raisons de chacune de ces étapes, veuillez nous éclairer dans les commentaires.
la source
config.secret_key_base
dans toutes vos applications, sinon il ne pourra pas décoder le cookie.Je suis tombé sur cela en cherchant le moyen le plus simple de définir le cookie comme domaine racine. Il semble qu'il y ait une certaine désinformation sur l'
:all
option lorsqu'elle est passée comme option de domaine. Pour la plupart des domaines, cela fonctionnera comme prévu, en définissant le cookie sur le domaine racine (par exemple.example.com
pourtest.example.com
). Je pense que la plupart des gens ont rencontré des problèmes car ils utilisent le domainelvh.me
pour tester. L'expression régulière utilisée par les rails pour rechercher un domaine de premier niveau est définie comme étantDOMAIN_REGEXP = /[^.]*\.([^.]*|..\...|...\...)$/
. Si vous notez la dernière partie, vous pouvez voir que rails s'interprètelvh.me
comme un TLD similaire àcom.au
. Si votre cas d'utilisation doitlvh.me
fonctionner, l':all
option ne fonctionnera pas correctement, cependant, elle semble être l'option la plus simple et la meilleure pour la plupart des domaines.TL; DR, la bonne réponse ici, en supposant que vous ne développiez pas sur un domaine à 3 lettres (ou tout domaine qui confond l'expression régulière ci-dessus) est d'utiliser
:all
.la source
Rails 4.x (devrait également convenir aux versions Rails 5/6)
Comment obtenir lvh.me:3000 et le sous-domaine dans localhost (Rails)
Développement: j'ai partagé des cookies pour ajouter
.lvh.me
danssession_store.rb
,Il sera partagé entre les sous-domaines sur localhost
admin.lvh.me:3000
,lvh.me:3000
et ainsi de suite ...la source
As-tu essayé
)
fondamentalement, nous disons avoir un cookie unique pour le domaine de base et ignorer simplement le sous-domaine ... bien que cette approche ait encore quelques défauts ...
la source
rails de support5
si vous voulez que cela fonctionne avec n'importe quel domaine:
Pour configurer par environnement, vous pouvez utiliser les éléments suivants:
Réf: https://github.com/plataformatec/devise/wiki/How-To:-Use-subdomains
la source
Si vous utilisez Redis pour le magasin de session.
la source