2011-12-20 14 views
7

Używam devise gem w aplikacji rails z wieloma subdomenami. Każda subdomena jest obsługiwany przez odpowiedni kontroler, który wyglądać tak:Devise + Subdomain - Przekieruj użytkownika do sign_in

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

Z powyższej implementacji kontrolera Devise zawsze subdomeny podczas przekierowanie użytkownika do strony logowania. W powyższym przykładzie skorzystaj z przekierowania użytkownika na numer http://subdomain1.acmesite/users/sign_in zamiast wspólnego adresu URL sign_in.

Prowadzi to do posiadania wielu adresów URL sign_in dla każdej subdomeny.

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

Zastanawiam się, czy to możliwe, aby zastąpić metodę opracować wykluczyć subdomeny część z URL i zarazem zachowując poprzednią informację URL strony. Bardziej precyzyjnie, chcę, aby Devise przekierowywał użytkownika do konkretnego adresu URL (na przykład: http://acmesite/users/sign_in) niezależnie od subdomeny i po udanym uwierzytelnieniu, program Devise powinien zwrócić użytkownika z powrotem do subdomeny + strony dzwoniącego.

Odpowiedz

-3

Upuściłem klejnot Devise z mojego projektu i teraz używam Czarnoksięstwa.

Czarodziej zapewnia pełną kontrolę nad kontrolerem i widokiem, w pełni spełnia moje wymagania dotyczące projektu. Z sześciomiesięcznym bieganiem po tej zmianie jestem zadowolony z klejnotu Sorcery.

+0

Ładna wskazówka. Próbuję tego ... – alf

2

Musisz napisać niestandardową funkcję FailureApp, która uruchamia się, gdy użytkownik jest nieuwierzytelniony.

Od 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 

i dodaj następujący w config/inicjalizatorów/devise.rb:

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

Jeśli otrzymujesz niezainicjowanej stały błąd CustomFailure, a ty umieścić Klasa CustomFailure w katalogu/lib, pamiętaj o automatycznym ładowaniu plików lib w pliku application.rb, jak poniżej:

config.autoload_paths += %W(#{config.root}/lib) 
Powiązane problemy