设计+子域 - 重定向用户sign_in

时间:2011-12-20 04:29:13

标签: ruby-on-rails devise subdomain

我在具有多个子域的rails应用程序中使用devise gem。每个子域由相应的控制器处理,如下所示:

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

通过上述控制器实现,Devise在将用户重定向到登录页面时始终保持子域名。在上述情况下,Devise将用户重定向到http://subdomain1.acmesite/users/sign_in,而不是公共sign_in Url。

这导致每个子域都有多个sign_in url。

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应该将用户返回到调用者子域+页面。

2 个答案:

答案 0 :(得分: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

在config / initializers / devise.rb中添加以下内容:

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

如果您收到未初始化的常量CustomFailure错误,并且已将CustomFailure类放在/ lib目录下,请确保在application.rb文件中自动加载您的lib文件,如下所示

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

答案 1 :(得分:-2)

我从我的项目中删除了Devise gem,现在使用了Sorcery。

法术为我提供了对控制器和视图的完全控制,完全符合我的项目要求。在这次过渡后,我有六个月的生产时间,我对Sorcery宝石很满意。