2013-02-02 8 views
5

gemme

ruby 1.9.3 
rails 3.2.11 
devise 2.2.3 
acts_as_tenant 0.2.9 

Codice

Tutti i miei modelli sono scope da un Domain_ID:multitenancy (acts_as_tenant) con Devise (utenti predefiniti scope da sottodominio) rompe le sessioni

class User < ActiveRecord::Base 
    acts_as_tenant(:domain) 
    #... 
end 

Poi, in il mio application_controller, ho impostato l'attuale titolare dal dominio:

class ApplicationController < ActionController::Base 
    set_current_tenant_through_filter 
    before_filter :set_tenant 
    protect_from_forgery 
    #... 

    def set_tenant 
    #... 
    @domain = Domain.find_or_create_by_name(request.host) 
    set_current_tenant(@domain) 
    end 
end 

Tutto funziona bene per tutti i modelli ad eccezione delle sessioni: Ogni volta che una pagina viene caricata, disconnetterà il primo utente che carica una pagina con un altro titolare. Con il caricamento della pagina, sarà log-out il primo utente che [... etc.]

Ipotesi: quando Alice visita un dominio, Rails carichi current_tenant = alice_domain (ok). Tutto funziona come previsto, finché Bob non visita un altro dominio, carica current_tenant = bob_domain. Quando Alice aggiorna la sua pagina, Rails ha ancora current_tenant == bob_domain. Rails controlla la sessione: Alice non esiste con l'ambito bob_domain, quindi Devise obbliga Alice a disconnettersi. Quindi application_controller imposta current_tenant = alice_domain ... che disconnette Bob.

soluzione sporca: non utilizzare acts_as_tenant nel modello di utente, gli utenti di ambito per dominio me stesso in ogni controller, quindi sovrascrivere escogitare al login portata e di registrazione per dominio. E non sono sicuro di come rendere conto a Devise del dominio corrente nelle sessioni. A proposito, sostituire act_as_tenant con un default_scope manuale in user cade nello stesso strano bug. Sembra molto sporco andare in questo modo.

Sto cercando una soluzione pulita per giorni. Sarei molto grato per qualsiasi aiuto.

risposta

3

fissato, in application_controller, cambiare

before_filter :set_tenant 

a

prepend_before_filter :set_tenant 

al fine di default_scope tutto, compreso l'utente, prima di Devise controlla la sessione dell'utente.

+0

Questo non funziona per me su/utenti/modifica percorso per qualche strana ragione ... –

+0

Sembra importante non usare 'current_user' prima di usare' set_current_tenant'. Potrebbe dipendere dal tuo server. Sto usando sottile, funziona anche con webrick. – Habax

Problemi correlati