Разработать редирект после неудачного входа - PullRequest
54 голосов
/ 29 апреля 2011

Все вопросы, которые я нашел, связаны с успешным входом в систему с помощником after_sign_in_path_for(resource)

У меня есть форма входа в систему в индексе сайта, и при неудачном входе в систему он перенаправляется на "users / sign_in"

Но как я могу перенаправить на свой "site # index" при неудачной авторизации?

Ответы [ 5 ]

92 голосов
/ 16 октября 2011
  1. Создайте файл custom_failure.rb в каталоге lib с:

    class CustomFailure < Devise::FailureApp
      def redirect_url
        your_path
      end
    
      def respond
        if http_auth?
          http_auth
        else
          redirect
        end
      end
    end
    
  2. В инициализаторе Devise укажите:

      config.warden do |manager|
        manager.failure_app = CustomFailure
      end
    
  3. Убедитесь, что Rails загружен в ваши lib-файлы, в вашем application.rb:

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

Не забудьте перезагрузить сервер.

Я не думаю, что есть более простой способ сделать это.Удачи.

14 голосов
/ 27 сентября 2013

Если вы используете свой собственный SessionsController, вы можете переназначить :recall значение auth_options, чтобы вызвать controller#method, который вы хотите, перед запуском warden.authenticate!(auth_options), например:

в приложении / controllers / users / session_controller.rb

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

Таким образом, вам не нужно создавать настраиваемое FailureApp и изменять настройки.

3 голосов
/ 30 декабря 2013

Вот что происходит с устройством 3.1.0

Started POST "/users/sign_in"
Processing by Devise::SessionsController#create
Completed 401 Unauthorized
Processing by Devise::SessionsController#new

new вызывается из-за auth_options, определенных в конце gems / devise-3.1.0 / app / controllers / devise / session_controller.rb

Вы должны переопределить auth_options, используемые в действии create. Я скопировал контроллер в app / controllers / devise / session_controller.rb моего приложения на Rails и заменил метод auth_options следующим образом

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

Это делает трюк, но URL все еще / users / sign_in

Я тоже постараюсь это исправить.

1 голос
/ 30 апреля 2011

Вы можете изменить путь входа по умолчанию.

Выезд https://github.com/plataformatec/devise/wiki/How-To:-Change-the-default-sign_in-and-sign_out-routes

0 голосов
/ 18 января 2016

Разрабатывая ответ Марсао, я настоятельно рекомендую поместить отладчик в ваш метод ответа CustomFailure, чтобы лучше понять, что происходит.

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.

Однако, если вы хотите вернуть стандартное состояние 401, как определено в методе http_auth , вы хотите убедиться, что код метода respond возвращает http_auth.

Таким образом, стоит взглянуть на определение http_auth? В частности, обратите внимание на метод: request.xhr?, который будет возвращать 0 для запросов json (напомним, что 0 в действительности соответствует true в ruby)

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

И, возможно, проверьте файл инициализатора / устройства для config.http_authenticatable_on_xhr или config.navigational_formats, чтобы контролировать ответ, который вы хотите. Эта конфигурация может реально повлиять на то, что возвращает Devise, и часто может привести к неожиданному поведению из-за того, что он делает здесь под капотом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...