2011-12-20 59 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) 
相关问题