requested rails page example custom current_user after_sign_in_path_for after ruby-on-rails redirect login devise

ruby on rails - rails - Diseñar redirigir después de que el inicio de sesión falla



rails authentication (5)

  1. 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

  2. En tu iniciador de ideas, incluye:

    config.warden do |manager| manager.failure_app = CustomFailure end

  3. 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.



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.