2011-12-20 13 views
7

Sto usando devise gem in un'applicazione rails con più sottodomini. Ogni sottodominio è gestita da rispettivi controller, che simile a questa:Devise + Sottodominio - Reindirizza utente per sign_in

class Subdomain1Controller < ApplicationController 
    before_filter :authenticate_user! 
    def index 
    end 
end 

Con l'implementazione del controller sopra, Devise tenere sempre sottodominio durante il reindirizzamento alla pagina di login dell'utente. Nel caso precedente, Devise reindirizza l'utente a http://subdomain1.acmesite/users/sign_in anziché a un comune sign_in Url.

Questo porta ad avere più URL sign_in per ogni sottodominio.

http://subdomain1.acmesite/users/sign_in 
http://subdomain2.acmesite/users/sign_in 
http://subdomain3.acmesite/users/sign_in 

Mi chiedo se è possibile eseguire l'override metodo di disposizione testamentaria di escludere parte sottodominio dall'URL e mantenendo il precedente informazioni URL della pagina ancora. Ancora più prezioso, voglio che Devise reindirizzi l'utente a un Url specifico (come ad esempio: http://acmesite/users/sign_in) indipendentemente dal sottodominio e, dopo aver eseguito correttamente l'autenticazione, Devise dovrebbe restituire l'utente alla sottodominio + pagina del chiamante.

risposta

-3

Ho eliminato Devise gem dal mio progetto e ora uso Sorcery.

La stregoneria mi fornisce il controllo completo sul controller e sulla visualizzazione, soddisfa pienamente i requisiti del mio progetto. Con sei mesi di produzione in produzione dopo questa transizione, sono felice con la gemma Sorcery.

+0

Un buon consiglio. Ci sto provando ... – alf

2

È necessario scrivere una FailureApp personalizzata che viene attivata quando l'utente non è autenticato.

Da How To: Redirect to a specific page when the user can not be authenticated

class CustomFailure < Devise::FailureApp 
    def redirect_url 
    #return super unless [:worker, :employer, :user].include?(scope) #make it specific to a scope 
    new_user_session_url(:subdomain => 'secure') 
    end 

    # You need to override respond to eliminate recall 
    def respond 
    if http_auth? 
     http_auth 
    else 
     redirect 
    end 
    end 
end 

e aggiungere il seguente in config/inizializzatori/devise.rb:

config.warden do |manager| 
    manager.failure_app = CustomFailure 
end 

Se stai ricevendo un errore CustomFailure costante non inizializzato, e hai messo il CustomFailure class sotto la directory/lib, assicurati di caricare automaticamente i file lib nel tuo file application.rb, come sotto

config.autoload_paths += %W(#{config.root}/lib) 
Problemi correlati