로그인 실패 후 리디렉션 고안
내가 찾은 모든 질문은 도우미와의 성공적인 로그인과 관련이 있습니다. after_sign_in_path_for(resource)
사이트 색인에 로그인 양식이 있으며 로그인에 실패하면 "users / sign_in"으로 리디렉션됩니다.
하지만 로그인이 실패하면 어떻게 "site # index"로 리디렉션 할 수 있습니까?
다음을 사용하여 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
Devise 이니셜 라이저에 다음을 포함합니다.
config.warden do |manager| manager.failure_app = CustomFailure end
Rails가 application.rb의 lib 파일에로드되어 있는지 확인하십시오.
config.autoload_paths += %W(#{config.root}/lib)
서버를 다시 시작하는 것을 잊지 마십시오.
이 작업을 수행하는 더 쉬운 방법이 없다고 생각합니다. 행운을 빕니다.
고유 한을 사용 하는 경우을 실행하기 전에 원하는 을 호출하기 위해 SessionsController
의 :recall
값을 다시 할당 할 수 있습니다 . 예를 들면 다음과 같습니다.auth_options
controller#method
warden.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
'programing' 카테고리의 다른 글
기본 Visual Studio 2010 및 2008 글꼴 (0) | 2021.01.11 |
---|---|
IntelliJ IDEA 글로벌 검색 (0) | 2021.01.11 |
urllib2를 사용하여 GET 대신 POST 호출 만들기 (0) | 2021.01.11 |
.gitignore는 모든 파일을 무시하고 * .foo를 재귀 적으로 허용합니다. (0) | 2021.01.11 |
아무것도 반환되지 않을 때 JSON 디코딩 오류 처리 (0) | 2021.01.11 |