ruby-on-rails after_sign_in_path_for - 登錄失敗後設計重定向




3 Answers

  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在您的application.rb中的lib文件中加載:

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

不要忘記重新啟動服務器。

我認為有一種更簡單的方法可以做到這一點。 祝你好運。

devise controller

我發現的所有問題都與使用幫助after_sign_in_path_for(resource)成功登錄有關after_sign_in_path_for(resource)

我在網站的索引中有一個登錄表單,當登錄失敗時,它會重定向到“users / sign_in”

但是,當登錄失敗時,如何重定向到我的“site #index”?




這就是設計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

我也會嘗試解決這個問題。




在詳細闡述Marcao的答案時,我強烈建議在CustomFailure響應方法中放置一些debugger ,以便更好地了解正在發生的事情。

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

如果您查看響應方法的FailureApp Devise源代碼 ,則可以非常輕鬆地了解發生了什麼。

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?的定義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返回的內容,並且由於它在幕後所做的事情,通常會導致意外行為。




Related