ruby on rails - rails - Diseñar redirigir después de que el inicio de sesión falla
rails authentication (5)
Cree un custom_failure.rb en su directorio lib, con:
class CustomFailure < Devise::FailureApp def redirect_url your_path end def respond if http_auth? http_auth else redirect end end end
En tu iniciador de ideas, incluye:
config.warden do |manager| manager.failure_app = CustomFailure end
Asegúrese de que Rails esté cargando sus archivos lib, en su application.rb:
config.autoload_paths += %W(#{config.root}/lib)
No te olvides de reiniciar tu servidor.
No creo que haya una manera más fácil de hacer esto. Buena suerte.
Todas las preguntas que he encontrado están relacionadas para un inicio de sesión exitoso con el ayudante after_sign_in_path_for(resource)
Tengo un formulario de inicio de sesión en el índice del sitio, y cuando el inicio de sesión falla, redirige a "users / sign_in"
¿Pero cómo puedo redireccionar a mi "índice de sitio #" cuando falla el inicio de sesión?
A partir de la respuesta de Marcao, recomiendo colocar algún debugger en su método de respuesta CustomFailure para comprender mejor lo que está sucediendo.
Class CustomFailure < Devise::FailureApp
def respond
binding.pry
super
end
end
Si nos fijamos en el código fuente de FailureApp Devise para el método de respuesta, es muy fácil entender lo que está sucediendo.
def respond
if http_auth?
http_auth
elsif warden_options[:recall]
recall
else
redirect
end
end
Por ejemplo, para devolver una redirect_url, querrá asegurarse de que los condicionales de su código de respond
finalmente devuelvan la redirect
.
Sin embargo, si desea devolver un estado 401 estándar como se define en el método http_auth , quiere verificar que su código de método de respond
devuelva http_auth
.
Por lo tanto, ¿vale la pena mirar la definición de http_auth?
En particular, tenga en cuenta el: request.xhr?
método, que devolverá 0 para solicitudes json (recuerde que 0 en realidad se evalúa como verdadero en ruby)
def http_auth?
if request.xhr?
Devise.http_authenticatable_on_xhr
else
!(request_format && is_navigational_format?)
end
end
Y tal vez verifique su archivo de inicializadores / config.http_authenticatable_on_xhr
para config.http_authenticatable_on_xhr
o config.navigational_formats
para controlar la respuesta que desee. Esta configuración realmente puede afectar lo que devuelve Devise y, a menudo, puede conducir a un comportamiento inesperado debido a lo que hace aquí bajo el capó.
Esto es lo que sucede con el dispositivo 3.1.0
Started POST "/users/sign_in"
Processing by Devise::SessionsController#create
Completed 401 Unauthorized
Processing by Devise::SessionsController#new
se llama a new por las auth_options definidas al final de gems / devise-3.1.0 / app / controllers / devise / sessions_controller.rb
Debería redefinir las auth_options utilizadas en la acción de creación. Copié el controlador en la aplicación / controladores / idear / sessions_controller.rb de mi aplicación Rails y reemplacé el método auth_options como este
def auth_options
{ :scope => resource_name, :recall => "Home#new" }
end
Hace el truco, pero la url sigue siendo / users / sign_in
Trataré de arreglar eso también.
Puede cambiar la ruta predeterminada de inicio de sesión.
Consulte https://github.com/plataformatec/devise/wiki/How-To:-Change-the-default-sign_in-and-sign_out-routes
Si usa su propio SessionsController
, puede volver a asignar el valor :recall
de auth_options
para recuperar el controller#method
que desea antes de ejecutar warden.authenticate!(auth_options)
, por ejemplo:
en la aplicación / controladores / usuarios / sessions_controller.rb
class Users::SessionsController < Devise::SessionsController
#...
def create
#...
auth_options = { :recall => ''site#index'', :scope => :user }
resource = warden.authenticate!(auth_options)
#...
end
#...
end
De esta forma, no es necesario crear la FailureApp personalizada y modificar las configuraciones.