Ich habe ein App-Setup, bei dem jeder Benutzer einer Firma angehört und diese Firma eine Subdomain hat (ich verwende Subdomains im Basislager-Stil). Das Problem, mit dem ich konfrontiert bin, besteht darin, dass Rails mehrere Cookies erstellt (eines für lvh.me und eines für subdomain.lvh.me), was zu einigen Unterbrechungen in meiner Anwendung führt (z. B. Flash-Nachrichten, die bei allen Anforderungen einmal bestehen bleiben angemeldet).
Ich habe dies in meiner Datei /cofig/initilizers/session_store.rb:
AppName::Application.config.session_store :cookie_store, key: '_application_devise_session', domain: :all
Die Domain :: Alles scheint die Standardantwort zu sein, die ich bei Google gefunden habe, aber das scheint bei mir nicht zu funktionieren. Jede Hilfe wird geschätzt!
quelle
config.secret_key_base
in allen Anwendungen dasselbe verwenden , da sonst das Cookie nicht dekodiert werden kann.CacheStore
Sitzungen in Memcached speichern möchte ?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/
Mit anderen Worten, Sie brauchen:
Auch eine gute Idee, um Ihre Cookies zu löschen
quelle
, :tld_length => 2
config.secret_key_base
in allen Anwendungen dasselbe verwenden , da sonst das Cookie nicht dekodiert werden kann.:domain => :all
funktioniert nicht in Rails 4, versuchen Sie esdomain => 'lvh.me', tld_length = 2
. Es hat für mich funktioniertdomain: :all, tld_length: 2
bei der Nutzung derlvh.me
Domain gute Ergebnisse erzielt .Ich suchte nach einer Möglichkeit, dieses Problem zu lösen, ohne den Domänennamen explizit angeben zu müssen, damit ich zwischen localhost, lvh.me und den Domänen wechseln konnte, die ich in der Produktion verwenden würde, ohne die Datei session_store.rb weiter bearbeiten zu müssen. Die Einstellung "domain :: all" schien jedoch nicht für mich zu funktionieren.
Letztendlich stellte ich fest, dass ich die tld_length (Domänenlänge der obersten Ebene) in diesem Ausdruck angeben musste. Die Standard-tld_length ist 1, während example.lvh.me eine tld_length von 2 und 127.0.0.1.xip.io beispielsweise eine tld_length von 5 hat. Was ich also in der Datei session_store.rb für Subdomains auf lvh.me in der Entwicklung und was auch immer in der Produktion hatte, war das Folgende.
Hoffe das hilft jemandem, da ich lange gebraucht habe, um diese Antwort zu finden!
quelle
Aus irgendeinem Grund
:all
funktionierte das Ersetzen durch die Domain bei mir nicht (Rails 3.2.11). Es dauerte ein Stück benutzerdefinierte Middleware, um das Problem zu beheben. Eine Zusammenfassung dieser Lösung finden Sie unten.tl; dr: Sie müssen eine benutzerdefinierte Rack-Middleware schreiben. Sie müssen es in Ihre hinzufügen
conifg/environments/[production|development].rb
. Dies ist auf Schienen 3.2.11Cookie-Sitzungen werden normalerweise nur für Ihre Top-Level-Domain gespeichert.
Wenn Sie nachsehen,
Chrome -> Settings -> Show advanced settings… -> Privacy/Content settings… -> All cookies and site data… -> Search {yourdomain.com}
können Sie sehen, dass es separate Einträge fürsub1.yourdomain.com
undothersub.yourdomain.com
und gibtyourdomain.com
Die Herausforderung besteht darin, in allen Subdomänen dieselbe Sitzungsspeicherdatei zu verwenden.
Schritt 1: Fügen Sie eine benutzerdefinierte Middleware-Klasse hinzu
Hier kommt Rack Middleware ins Spiel . Einige relevante Rack & Rails-Ressourcen:
Hier ist eine benutzerdefinierte Klasse, die Sie hinzufügen sollten.
lib
Dies wurde von @Nader geschrieben und Sie alle sollten ihm dankenIm Grunde bedeutet dies, dass alle Ihre Cookie-Sitzungsdaten wieder genau derselben Cookie-Datei zugeordnet werden, die Ihrer Stammdomäne entspricht.
Schritt 2: Zu Schienen hinzufügen Konfiguration
Nachdem Sie eine benutzerdefinierte Klasse in lib haben, stellen Sie sicher, dass diese automatisch geladen wird. Wenn Ihnen das nichts bedeutet hat, schauen Sie hier: Rails 3 Autoload
Stellen Sie zunächst sicher, dass Sie mithilfe eines Cookie-Speichers systemweit sind. In
config/application.rb
sagen wir Rails, dass sie einen Cookie-Laden benutzen sollen.Der Grund, warum dies hier erwähnt wird, liegt in der
:domain => :all
Linie. Es gibt andere Personen, die vorgeschlagen haben,:domain => ".yourdomain.com"
anstelle von anzugeben:domain => :all
. Aus irgendeinem Grund funktionierte dies bei mir nicht und ich benötigte die benutzerdefinierte Middleware-Klasse wie oben beschrieben.Dann
config/environments/production.rb
fügen Sie hinzu:Beachten Sie, dass der vorhergehende Punkt erforderlich ist. Weitere Informationen finden Sie unter " Subdomain-Cookies, die in einer übergeordneten Domain-Anfrage gesendet wurden? ".
Dann
config/environments/development.rb
fügen Sie hinzu:Der Trick lvh.me wird auf localhost abgebildet. Es ist toll. Weitere Informationen finden Sie in diesem Railscast zu Subdomains und in diesem Hinweis .
Hoffentlich sollte es das tun. Ich bin mir ehrlich gesagt nicht ganz sicher, warum der Prozess so kompliziert ist, da ich der Meinung bin, dass Cross-Subdomain-Sites häufig sind. Wenn jemand weitere Einblicke in die Gründe für jeden dieser Schritte hat, klären Sie uns bitte in den Kommentaren auf.
quelle
config.secret_key_base
in allen Anwendungen dasselbe verwenden , da sonst das Cookie nicht dekodiert werden kann.Ich bin darauf gestoßen, als ich nach dem einfachsten Weg gesucht habe, das Cookie als Root-Domain festzulegen. Es scheint, dass es einige Fehlinformationen über die
:all
Option gibt, wenn sie als Domänenoption übergeben wird. Bei den meisten Domains funktioniert es tatsächlich wie erwartet und setzt das Cookie auf die Root-Domain (z . B..example.com
fürtest.example.com
). Ich denke, die meisten Leute hatten Probleme, da sie die Domainlvh.me
zum Testen verwenden. Der reguläre Ausdruck, der von Rails verwendet wird, um eine Domäne der obersten Ebene zu finden, ist definiert alsDOMAIN_REGEXP = /[^.]*\.([^.]*|..\...|...\...)$/
. Wenn Sie den letzten Teil notieren, können Sie sehen, dass Schienenlvh.me
als TLD ähnlich interpretiert werdencom.au
. Wenn Ihr Anwendungsfalllvh.me
funktionieren muss, dann ist der:all
Option nicht ordnungsgemäß. Sie scheint jedoch für die meisten Domänen die einfachste und beste Option zu sein.TL; DR, die richtige Antwort hier, vorausgesetzt, Sie entwickeln nicht auf einer 3-Buchstaben-Domain (oder einer Domain, die den obigen regulären Ausdruck verwirrt), ist zu verwenden
:all
.quelle
Rails 4.x (sollte auch mit Rails 5/6-Versionen in Ordnung sein)
So erhalten Sie lvh.me:3000 und Subdomain in localhost (Rails)
Entwicklung: Ich habe Cookies zum Hinzufügen
.lvh.me
in geteiltsession_store.rb
,Es wird zwischen Subdomains auf localhost geteilt
admin.lvh.me:3000
.lvh.me:3000
und so weiter ...quelle
Hast du versucht
)
Grundsätzlich sagen wir, haben Sie ein einzelnes Cookie für die Basisdomäne und ignorieren Sie einfach die Unterdomäne. Obwohl dieser Ansatz noch einige Mängel aufweist ...
quelle
Stützschienen5
Wenn Sie möchten, funktioniert es mit jeder Domain:
Zum Konfigurieren pro Umgebung können Sie Folgendes verwenden:
Ref: https://github.com/plataformatec/devise/wiki/How-To:-Use-subdomains
quelle
Wenn Sie Redis für den Sitzungsspeicher verwenden.
quelle