登录失败后设计重定向

时间:2011-04-29 13:23:30

标签: ruby-on-rails redirect login devise

我发现的所有问题都与使用帮助程序成功登录有关 after_sign_in_path_for(resource)

我在网站的索引中有一个登录表单,当登录失败时,它会重定向到“users / sign_in”

但是当登录失败时如何重定向到我的“site #index”?

5 个答案:

答案 0 :(得分:92)

  1. 在lib目录中创建一个custom_failure.rb,其中包含:

    class CustomFailure < Devise::FailureApp
      def redirect_url
        your_path
      end
    
      def respond
        if http_auth?
          http_auth
        else
          redirect
        end
      end
    end
    
  2. 在您设计初始化程序时,请包括:

      config.warden do |manager|
        manager.failure_app = CustomFailure
      end
    
  3. 确保Rails加载到您的lib文件中,在您的application.rb中:

    config.autoload_paths += %W(#{config.root}/lib)
    
  4. 不要忘记重新启动服务器。

    我认为没有更简单的方法可以做到这一点。祝你好运。

答案 1 :(得分:14)

如果您使用自己的SessionsController,则可以在运行:recall之前重新指定auth_options controller#method值,以便调出所需的warden.authenticate!(auth_options),例如:

/ app / users / sessions_controller.rb

中的

class Users::SessionsController < Devise::SessionsController
  #...
  def create
    #...
    auth_options = { :recall => 'site#index', :scope => :user }
    resource = warden.authenticate!(auth_options)
    #...
  end
  #...
end

通过这种方式,您无需创建自定义的FailureApp并修改配置。

答案 2 :(得分:3)

这是设计3.1.0

的情况
Started POST "/users/sign_in"
Processing by Devise::SessionsController#create
Completed 401 Unauthorized
Processing by Devise::SessionsController#new
由于gems / devise-3.1.0 / app / controllers / devise / sessions_controller.rb末尾定义的auth_options

new被调用

您应该重新定义create动作中使用的auth_options。我在我的Rails应用程序的app / controllers / devise / sessions_controller.rb中复制了控制器,并替换了像这样的auth_options方法

def auth_options
  { :scope => resource_name, :recall => "Home#new" }
end

它可以解决问题,但网址仍为/ users / sign_in

我也会尝试解决这个问题。

答案 3 :(得分:1)

答案 4 :(得分:0)

在阐述Marcao的答案时,我强烈建议在CustomFailure响应方法中放置一些debugger,以便更好地了解正在发生的事情。

Class CustomFailure < Devise::FailureApp
  def respond
    binding.pry
    super
  end
end

如果您查看响应方法的FailureApp Devise Source Code,则可以非常轻松地了解正在发生的事情。

def respond
  if http_auth?
    http_auth
  elsif warden_options[:recall]
    recall
  else
    redirect
  end
end

例如,为了返回redirect_url,您需要确保respond代码条件最终返回redirect

但是,如果您想要返回http_auth方法中定义的标准401状态,则需要验证respond方法代码是否返回http_auth

因此,值得您研究http_auth?的定义 特别要注意:request.xhr?方法,它将为json请求返回0(回想一下0实际上在ruby中的计算结果为true)

def http_auth?
  if request.xhr?
    Devise.http_authenticatable_on_xhr
  else
    !(request_format && is_navigational_format?)
  end
end

也许检查config.http_authenticatable_on_xhrconfig.navigational_formats的初始值设定项/设计文件,以便控制所需的响应。这种配置确实可以影响Devise返回的内容,并且由于它在幕后所做的事情,通常会导致意外的行为。