Tengo una configuración de aplicación en la que cada usuario pertenece a una empresa, y esa empresa tiene un subdominio (estoy usando subdominios de estilo basecamp). El problema al que me enfrento es que los rieles están creando múltiples cookies (una para lvh.me y otra para subdominio.lvh.me), lo que está causando bastantes interrupciones en mi aplicación (como mensajes flash persistentes en todas las solicitudes una vez) registrado).
Tengo esto en mi archivo /cofig/initilizers/session_store.rb:
AppName::Application.config.session_store :cookie_store, key: '_application_devise_session', domain: :all
El dominio:: todo parece ser la respuesta estándar que encontré en Google, pero eso no parece funcionar para mí. ¡Se agradece cualquier ayuda!
fuente
config.secret_key_base
en todas sus aplicaciones, o de lo contrario no podrá decodificar la cookie.CacheStore
para almacenar sesiones en 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 otras palabras, necesitas:
También es una buena idea borrar sus cookies
fuente
, :tld_length => 2
config.secret_key_base
en todas sus aplicaciones, o de lo contrario no podrá decodificar la cookie.:domain => :all
no funcionará en Rails 4, inténtalodomain => 'lvh.me', tld_length = 2
. Funcionó para mídomain: :all, tld_length: 2
usar ellvh.me
dominio.Estaba buscando una manera de resolver este problema sin tener que indicar explícitamente el nombre de dominio, para poder saltar entre localhost, lvh.me y cualquier dominio que usaría en producción sin tener que seguir editando el archivo session_store.rb. Sin embargo, la configuración de "dominio:: todos" no parecía funcionar para mí.
En última instancia, descubrí que necesitaba indicar tld_length (longitud del dominio de nivel superior) en esa expresión. El tld_length predeterminado es 1 mientras que example.lvh.me tiene un tld_length de 2 y 127.0.0.1.xip.io tiene un tld_length de 5, por ejemplo. Entonces, lo que tenía en el archivo session_store.rb para subdominios en lvh.me en desarrollo y cualquier otra cosa en producción fue el siguiente.
Espero que esto ayude a alguien, ¡ya que me tomó mucho tiempo encontrar esta respuesta!
fuente
Por alguna razón, reemplazar
:all
con el dominio no funcionó (rieles 3.2.11) para mí. Se necesitó una pieza de Middleware personalizado para solucionarlo. A continuación se muestra un resumen de esa solución.tl; dr: Necesita escribir un Rack Middleware personalizado. Necesita agregarlo a su
conifg/environments/[production|development].rb
. Esto está en Rails 3.2.11Las sesiones de cookies generalmente se almacenan solo para su dominio de nivel superior.
Si miras en
Chrome -> Settings -> Show advanced settings… -> Privacy/Content settings… -> All cookies and site data… -> Search {yourdomain.com}
Puedes ver que habrá entradas separadas parasub1.yourdomain.com
yothersub.yourdomain.com
yyourdomain.com
El desafío consiste en utilizar el mismo archivo de almacenamiento de sesión en todos los subdominios.
Paso 1: agregar una clase de middleware personalizada
Aquí es donde entra en juego Rack Middleware . Algunos recursos de rack y rieles relevantes:
Aquí hay una clase personalizada que debe agregar en el
lib
Esto fue escrito por @Nader y todos deben agradecerleBásicamente, lo que hace es que mapeará todos los datos de su sesión de cookies en el mismo archivo de cookies que es igual a su dominio raíz.
Paso 2: Agregar a la configuración de rieles
Ahora que tiene una clase personalizada en lib, asegúrese de cargarla automáticamente. Si eso no significa nada para usted, mire aquí: Autocarga de Rails 3
Lo primero es asegurarse de utilizar un almacén de cookies en todo el sistema. En
config/application.rb
le decimos a Rails que use una tienda de cookies.La razón por la que esto está aquí se menciona aquí es por la
:domain => :all
línea. Hay otras personas que han sugerido especificar en:domain => ".yourdomain.com"
lugar de:domain => :all
. Por alguna razón, esto no funcionó para mí y necesitaba la clase Middleware personalizada como se describe anteriormente.Luego en su
config/environments/production.rb
complemento:Tenga en cuenta que el punto anterior es necesario. Consulte " Cookies de subdominio, ¿enviadas en una solicitud de dominio principal? " Para saber por qué.
Luego en su
config/environments/development.rb
complemento:El truco lvh.me se asigna a localhost. Es impresionante. Consulte este Railscast sobre subdominios y esta nota para obtener más información.
Con suerte, debería hacerlo. Honestamente, no estoy del todo seguro de por qué el proceso es tan complicado, ya que creo que los sitios de subdominios cruzados son comunes. Si alguien tiene más información sobre las razones detrás de cada uno de estos pasos, infórmenos en los comentarios.
fuente
config.secret_key_base
en todas sus aplicaciones, o de lo contrario no podrá decodificar la cookie.Me encontré con esto mientras buscaba la forma más sencilla de configurar la cookie para que sea el dominio raíz. Parece que hay información errónea sobre la
:all
opción cuando se pasa como opción de dominio. Para la mayoría de los dominios, funcionará como se esperaba, configurando la cookie en el dominio raíz (por ejemplo,.example.com
paratest.example.com
). Creo que la mayoría de las personas experimentaron problemas porque están usando el dominiolvh.me
para realizar pruebas. La expresión regular utilizada por rieles para encontrar un dominio de nivel superior se define comoDOMAIN_REGEXP = /[^.]*\.([^.]*|..\...|...\...)$/
. Si observa la última parte, puede ver que rails se interpretalvh.me
como un TLD similar acom.au
. Si su caso de uso necesitalvh.me
funcionar, entonces la:all
opción no funcionará correctamente, sin embargo, parece ser la mejor y más simple opción para la mayoría de los dominios.TL; DR, la respuesta correcta aquí, asumiendo que no está desarrollando en un dominio de 3 letras (o cualquier dominio que confunda la expresión regular anterior) es usar
:all
.fuente
Rails 4.x (también debería funcionar con las versiones Rails 5/6)
Cómo obtener lvh.me:3000 y el subdominio en localhost (Rails)
Desarrollo: he compartido cookies para añadir
.lvh.me
asession_store.rb
,Se compartirá entre subdominios en localhost
admin.lvh.me:3000
,lvh.me:3000
y así sucesivamente ...fuente
Has probado
)
Básicamente, estamos diciendo que tenga una sola cookie para el dominio base y simplemente ignore el subdominio ... aunque este enfoque todavía tiene algunos defectos ...
fuente
rieles de soporte5
si quieres que funcione con cualquier dominio:
Para configurar por entorno, puede utilizar lo siguiente:
Ref: https://github.com/plataformatec/devise/wiki/How-To:-Use-subdomains
fuente
Si está utilizando Redis para almacenar sesiones.
fuente