programing

로그인 실패 후 리디렉션 고안

nasanasas 2021. 1. 11. 08:19
반응형

로그인 실패 후 리디렉션 고안


내가 찾은 모든 질문은 도우미와의 성공적인 로그인과 관련이 있습니다. after_sign_in_path_for(resource)

사이트 색인에 로그인 양식이 있으며 로그인에 실패하면 "users / sign_in"으로 리디렉션됩니다.

하지만 로그인이 실패하면 어떻게 "site # index"로 리디렉션 할 수 있습니까?


  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. Devise 이니셜 라이저에 다음을 포함합니다.

      config.warden do |manager|
        manager.failure_app = CustomFailure
      end
    
  3. Rails가 application.rb의 lib 파일에로드되어 있는지 확인하십시오.

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

서버를 다시 시작하는 것을 잊지 마십시오.

이 작업을 수행하는 더 쉬운 방법이 없다고 생각합니다. 행운을 빕니다.


고유 한을 사용 하는 경우을 실행하기 전에 원하는 을 호출하기 위해 SessionsController:recall값을 다시 할당 할 수 있습니다 . 예를 들면 다음과 같습니다.auth_optionscontroller#methodwarden.authenticate!(auth_options)

app / controllers / 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을 만들고 구성을 수정할 필요가 없습니다.


이것은 devise 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가 호출됩니다.

생성 작업에 사용 된 auth_options를 다시 정의해야합니다. Rails 애플리케이션의 app / controllers / devise / sessions_controller.rb에 컨트롤러를 복사하고 다음과 같이 auth_options 메서드를 대체했습니다.

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

트릭을 수행하지만 URL은 여전히 ​​/ users / sign_in입니다.

나는 그것도 고치려고 노력할 것이다.


기본 sign_in 경로를 변경할 수 있습니다.

https://github.com/plataformatec/devise/wiki/How-To:-Change-the-default-sign_in-and-sign_out-routes를 확인 하세요.


Elaborating on Marcao's answer, I highly recommend placing some debugger in your CustomFailure respond method in order to better understand what is going on.

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

If you look at the FailureApp Devise Source Code for the respond method it is super easy to understand what is going on.

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

So for example in order to return a redirect_url you would want to make sure that your respond code conditionals eventually return redirect.

However if you want to maybe return a standard 401 status as defined in the http_auth method, you want to verify that your respond method code returns http_auth.

Thus it is worth your while to look into the definition of the http_auth? In particular, note the: request.xhr? method, which will return 0 for json requests (recall that 0 actually evaluates to true in ruby)

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

And maybe check your initializers/devise file for config.http_authenticatable_on_xhr or config.navigational_formats in order to control the response that you want. This configuration can really affect what Devise returns and can often lead to unexpected behavior due to what it does here under the hood.

ReferenceURL : https://stackoverflow.com/questions/5832631/devise-redirect-after-login-fail

반응형