2011-12-20 2 views
7

Я использую придуманный драгоценный камень в приложении rails с несколькими подобластями. Каждый поддомен обрабатывается соответствующим контроллером, который выглядит следующим образом:Devise + Subdomain - перенаправить пользователя для sign_in

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

С выше реализации контроллера Разрабатывают всегда держать поддомен, а перенаправлять пользователя на страницу входа в систему. В приведенном выше случае Devise перенаправляет пользователя на http://subdomain1.acmesite/users/sign_in вместо обычного sign_in Url.

Это приводит к наличию нескольких URL-адресов sign_in для каждого из поддоменов.

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

мне интересно, если это возможно, чтобы переопределить метод DEViSE, чтобы исключить субдомен часть из URL и тем не менее, сохраняя предыдущую информацию URL страницы. Более ценно, я хочу, чтобы Devise перенаправлял пользователя на определенный Url (например: http://acmesite/users/sign_in) независимо от субдомена и после успешной аутентификации Devise должен вернуть пользователя обратно на субдомен + страницу.

ответ

-3

Я выложил драгоценный камень из моего проекта и теперь вместо этого использовал Волшебство.

Волшебство обеспечивает полный контроль над контроллером и просмотр, полностью соответствует моим требованиям к проекту. После шести месяцев работы на производстве после этого перехода я доволен драгоценным камнем волшебства.

+0

Хороший отзыв. Я пробую это ... – alf

2

Вам необходимо написать пользовательскую FailureApp, которая срабатывает, когда пользователь не прошел проверку подлинности.

От 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 

И добавить следующее в конфигурации/инициализаторах/devise.rb:

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

Если вы получаете неинициализированный постоянную ошибку CustomFailure, и вы поставить CustomFailure под вашим/lib каталогом, обязательно загрузите файлы lib в файл application.rb, например, ниже

config.autoload_paths += %W(#{config.root}/lib) 
Смежные вопросы