2011-12-20 94 views
7

我在具有多個子域的rails應用程序中使用了devise gem。每個子域由相應的控制器,它看起來是這樣處理的: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。

這導致每個子域都有多個sign_in網址。

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

我想知道是否有可能重寫設計方法,從網址中排除子域部分,並保持前一頁的網址信息。更爲珍貴的是,我希望Devise將用戶重定向到特定的Url(如:http://acmesite/users/sign_in),而不考慮子域,並且在成功認證後,Devise應該將用戶返回給調用者子域+頁面。

回答

-3

我從我的項目中掉下了設計寶石,現在使用了巫術。

巫術爲我提供了對控制器和視圖的完全控制,完全符合我的項目要求。在這次過渡之後,經過六個月的生產,我對魔法寶石感到滿意。

+0

不錯的提示。我正在嘗試這個... – alf 2012-08-19 22:26:58

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錯誤,並且已經把您的/ lib目錄下的CustomFailure類,請確保自動載入您的application.rb文件中的lib文件,如下所示

config.autoload_paths += %W(#{config.root}/lib) 
相關問題