login失败后deviseredirect
我发现的所有问题都与帮助者after_sign_in_path_for(resource)
成功login有关,
我在网站的索引中有一个login表单,当login失败时,它redirect到“users / sign_in”
但是,如果login失败,我怎么能redirect到我的“网站#索引”?
-
在你的lib目录下创build一个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
,则可以在运行warden.authenticate!(auth_options)
之前重新指定auth_options
:recall
值以调用所需的controller#method
,例如:
在应用程序/控制器/用户/ sessions_controller.rb
class Users::SessionsController < Devise::SessionsController #... def create #... auth_options = { :recall => 'site#index', :scope => :user } resource = warden.authenticate!(auth_options) #... end #... end
通过这种方式,您不需要创build自定义的FailureApp并修改configuration。
这是devise3.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而调用了新的get
您应该重新定义创build操作中使用的auth_options。 我将控制器复制到我的Rails应用程序的app / controllers / devise / sessions_controller.rb中,并replace了这样的auth_options方法
def auth_options { :scope => resource_name, :recall => "Home#new" } end
它的窍门,但url仍然是/用户/ sign_in
我会尽力解决这个问题。
您可以更改默认的sign_inpath。
看看https://github.com/plataformatec/devise/wiki/How-To:-Change-the-default-sign_in-and-sign_out-routes
在Marcao的回答中,我强烈build议在CustomFailure响应方法中放置一些debugging器 ,以便更好地理解正在发生的事情。
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
。
但是,如果您想要返回http_auth方法中定义的标准401状态,则需要validation您的respond
方法代码是否返回http_auth
。
因此,值得一看http_auth?
的定义http_auth?
特别注意: request.xhr?
方法,这将返回0的JSON请求(回想0实际上在ruby评估为真)
def http_auth? if request.xhr? Devise.http_authenticatable_on_xhr else !(request_format && is_navigational_format?) end end
也许检查你的初始化/devise文件config.http_authenticatable_on_xhr
或config.navigational_formats
为了控制你想要的响应。 这个configuration实际上可以影响Devise返回的结果,并且通常会导致意外的行为,这是由于它在这里所做的。