Eu tenho uma configuração de aplicativo em que cada usuário pertence a uma empresa e essa empresa tem um subdomínio (estou usando subdomínios no estilo basecamp). O problema que estou enfrentando é que o rails está criando vários cookies (um para lvh.me e outro para subdomain.lvh.me), o que está causando algumas interrupções em meu aplicativo (como mensagens flash persistentes apesar de todas as solicitações uma vez assinado).
Eu tenho isso em meu arquivo /cofig/initilizers/session_store.rb:
AppName::Application.config.session_store :cookie_store, key: '_application_devise_session', domain: :all
O domínio:: all parece ser a resposta padrão que encontrei no Google, mas não parece estar funcionando para mim. Qualquer ajuda é apreciada!
fonte
config.secret_key_base
em todos os seus aplicativos, caso contrário, não será possível decodificar o cookie.CacheStore
para armazenar sessões no 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/
Em outras palavras, você precisa:
Também é uma boa ideia limpar seus cookies
fonte
, :tld_length => 2
config.secret_key_base
em todos os seus aplicativos, caso contrário, não será possível decodificar o cookie.:domain => :all
não funcionará no Rails 4, tentedomain => 'lvh.me', tld_length = 2
. Funcionou para mimdomain: :all, tld_length: 2
usando olvh.me
domínio.Eu estava procurando uma maneira de resolver esse problema sem precisar declarar explicitamente o nome de domínio, para que pudesse alternar entre localhost, lvh.me e quaisquer domínios que usaria na produção sem ter que continuar editando o arquivo session_store.rb. No entanto, definir "domínio:: all" não parece estar funcionando para mim.
Por fim, descobri que precisava declarar o tld_length (comprimento do domínio de nível superior) nessa expressão. O tld_length padrão é 1, enquanto example.lvh.me tem tld_length de 2 e 127.0.0.1.xip.io tem tld_length de 5, por exemplo. Então, o que eu tinha no arquivo session_store.rb para subdomínios em lvh.me em desenvolvimento e tudo o mais em produção era o abaixo.
Espero que isso ajude alguém, pois demorei muito para encontrar essa resposta!
fonte
Por algum motivo, a substituição
:all
com o domínio não funcionou (rails 3.2.11) para mim. Foi preciso um middleware personalizado para consertar. Um resumo dessa solução está abaixo.tl; dr: Você precisa escrever um Middleware de Rack personalizado. Você precisa adicioná-lo ao seu
conifg/environments/[production|development].rb
. Isso está no Rails 3.2.11As sessões de cookies geralmente são armazenadas apenas para o seu domínio de nível superior.
Se você olhar em
Chrome -> Settings -> Show advanced settings… -> Privacy/Content settings… -> All cookies and site data… -> Search {yourdomain.com}
você pode ver que haverá entradas separadas parasub1.yourdomain.com
eothersub.yourdomain.com
eyourdomain.com
O desafio é usar o mesmo arquivo de armazenamento de sessão em todos os subdomínios.
Etapa 1: adicionar classe de middleware personalizada
É aqui que entra o Rack Middleware . Alguns recursos de rack e trilhos relevantes:
Aqui está uma classe personalizada que você deve adicionar no
lib
This foi escrito por @Nader e todos vocês devem agradecê-loBasicamente, o que isso faz é mapear todos os dados da sua sessão de cookie de volta para o mesmo arquivo de cookie que é igual ao seu domínio raiz.
Etapa 2: Adicionar à configuração do Rails
Agora que você tem uma classe personalizada em lib, certifique-se de carregá-la automaticamente. Se isso não significava nada para você, veja aqui: autoload do Rails 3
A primeira coisa é certificar-se de que você está usando um armazenamento de cookies em todo o sistema. Em
config/application.rb
nós dizemos ao Rails para usar um armazenamento de cookies.A razão pela qual isso está aqui é mencionado aqui é por causa da
:domain => :all
linha. Outras pessoas sugeriram especificar em:domain => ".yourdomain.com"
vez de:domain => :all
. Por algum motivo, isso não funcionou para mim e eu precisava da classe de Middleware personalizada conforme descrito acima.Então, em seu
config/environments/production.rb
add:Observe que o ponto anterior é necessário. Consulte " cookies de subdomínio, enviados em uma solicitação de domínio pai? " Para saber por quê.
Então, em seu
config/environments/development.rb
add:O truque do lvh.me mapeia para localhost. É incrivel. Veja este Railscast sobre subdomínios e esta nota para mais informações.
Esperançosamente isso deve bastar. Sinceramente, não tenho certeza de por que o processo é tão complicado, pois acho que sites de subdomínios cruzados são comuns. Se alguém tiver mais informações sobre as razões por trás de cada uma dessas etapas, esclareça-nos nos comentários.
fonte
config.secret_key_base
em todos os seus aplicativos, ou então não será capaz de decodificar o cookie.Eu me deparei com isso enquanto procurava a maneira mais simples de definir o cookie como o domínio raiz. Parece que há alguma desinformação sobre a
:all
opção quando passada como opção de domínio. Para a maioria dos domínios, ele realmente funcionará conforme o esperado, configurando o cookie para o domínio raiz (por exemplo,.example.com
paratest.example.com
). Acho que a maioria das pessoas teve problemas porque estão usando o domíniolvh.me
para testar. O regex usado por rails para encontrar um domínio de nível superior é definido comoDOMAIN_REGEXP = /[^.]*\.([^.]*|..\...|...\...)$/
. Se você observar a última parte, verá que o rails é interpretadolvh.me
como um TLD semelhante acom.au
. Se o seu caso de uso precisarlvh.me
funcionar, a:all
opção não funcionará corretamente; no entanto, parece ser a opção mais simples e melhor para a maioria dos domínios.TL; DR, a resposta correta aqui, assumindo que você não está desenvolvendo em um domínio de 3 letras (ou qualquer domínio que confunda o regex acima) é usar
:all
.fonte
Rails 4.x (também deve funcionar nas versões Rails 5/6)
Como obter lvh.me:3000 e subdomínio em localhost (Rails)
Desenvolvimento: Eu compartilhei cookies para acrescentar
.lvh.me
emsession_store.rb
,Ele será compartilhada entre subdomínios em localhost
admin.lvh.me:3000
,lvh.me:3000
e assim por diante ...fonte
Você tentou
)
basicamente, estamos dizendo para ter um único cookie para o domínio base e apenas ignorar o subdomínio ... embora essa abordagem ainda tenha algumas falhas ...
fonte
trilhos de suporte 5
se você quiser que funcione com qualquer domínio:
Para configurar por ambiente, você pode usar o seguinte:
Ref: https://github.com/plataformatec/devise/wiki/How-To:-Use-subdomains
fonte
Se você estiver usando Redis para armazenamento de sessão.
fonte