rails rail current_user create con autenticacion ruby-on-rails devise multi-tenant

ruby on rails - current_user - Registra un usuario en su subdominio después del registro con Rails and Devise



devise rail (2)

Estoy usando Devise para autenticación en mi aplicación Rails 3. La aplicación usa los esquemas de PostgreSQL y la gema del Apartamento para facilitar el multi-arrendamiento.

Iniciar y cerrar sesión en un subdominio específico funciona muy bien después de crear una cuenta. Los usuarios solo pueden iniciar sesión en el subdominio para su cuenta específica, lo cual es genial.

Aquí es donde me encuentro con problemas ...

Un nuevo usuario golpea la URL de registro en:

http://foo.com/signup

De forma predeterminada, cuando hacen clic en enviar, se crea la nueva cuenta, pero el usuario se envía a:

http://foo.com/dashboard

En cambio, quiero que vayan a:

http://myaccount.foo.com/dashboard

Para lograr esto, after_sign_up_path_for método after_sign_up_path_for en mi archivo registrations_controller.rb :

def after_sign_up_path_for(resource) root_url(:subdomain => resource.account.subdomain) end

Esto funciona según lo previsto, carga la URL correcta, pero la sesión del usuario se creó para el dominio raíz (foo.com) en lugar del subdominio, por lo que se solicita al usuario que inicie sesión.

Una sugerencia que encontré es cambiar config/initializers/session_store.rb a:

config.session_store :cookie_store, :key => ''_domain_session'', :domain => :all

Pero esto permite que cualquier persona inicie sesión en una cuenta en cualquier subdominio, lo que obviamente no es bueno.

Pregunta: ¿Cómo puedo asegurarme de que la sesión creada al registrarse sea ​​válida para el subdominio que se creó durante el proceso de suscripción?


Podrías usar domain: :all option en tu config.session_store y solo tener una before_action tal como lo sugirieron algunos en los comentarios.

Por lo tanto, seguirá teniendo el código en config / initializers / session_store.rb o en config / application.rb:

config.session_store :cookie_store, :key => ''_domain_session'', :domain => :all

Luego, en su application_controller agregue el siguiente código:

#app/controllers/application_controller.rb before_action :check_subdomain def check_subdomain unless request.subdomain == current_user.account.subdomain redirect_to root_path, alert: "You are not authorized to access that subdomain." end end


Reemplazar el controlador de sesión ideado.

Cree un archivo con la ruta de acceso exacta app/controllers/devise/sessions_controller.rb

Anule la clase sessions_controller en ese controlador. Pegue el código que se encuentra en el enlace. https://github.com/plataformatec/devise/blob/master/app/controllers/devise/sessions_controller.rb

class Devise::SessionsController < DeviseController # copy-paste the devise session controller below. ... end

Edite la acción de create para adaptarla a sus necesidades.

def create self.resource = warden.authenticate!(auth_options) set_flash_message(:notice, :signed_in) if is_flashing_format? sign_in(resource_name, resource) yield resource if block_given? respond_with resource, :location => after_sign_in_path_for(resource) end

Estoy buscando para ver si puedo averiguar exactamente cómo hacer que esto funcione, pero sé con certeza que el resultado que desea es posible anulando el controlador de la sesión de diseño.

EDITAR

Si usa cookies de subdominio cruzado, puede aplicar la sesión de subdominio con un before_filter. Por ejemplo

before_action do redirect_to root_path, alert: ''That subdomain does not belong to you'' if request.subdomain != current_user.subdomain end