我发现的所有问题都与使用帮助程序成功登录有关
after_sign_in_path_for(resource)
我在网站的索引中有一个登录表单,当登录失败时,它会重定向到“users / sign_in”
但是当登录失败时如何重定向到我的“site #index”?
答案 0 :(得分:92)
在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
在您设计初始化程序时,请包括:
config.warden do |manager|
manager.failure_app = CustomFailure
end
确保Rails加载到您的lib文件中,在您的application.rb中:
config.autoload_paths += %W(#{config.root}/lib)
不要忘记重新启动服务器。
我认为没有更简单的方法可以做到这一点。祝你好运。
答案 1 :(得分:14)
如果您使用自己的SessionsController
,则可以在运行:recall
之前重新指定auth_options
controller#method
值,以便调出所需的warden.authenticate!(auth_options)
,例如:
class Users::SessionsController < Devise::SessionsController
#...
def create
#...
auth_options = { :recall => 'site#index', :scope => :user }
resource = warden.authenticate!(auth_options)
#...
end
#...
end
通过这种方式,您无需创建自定义的FailureApp并修改配置。
答案 2 :(得分:3)
这是设计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被调用
您应该重新定义create动作中使用的auth_options。我在我的Rails应用程序的app / controllers / devise / sessions_controller.rb中复制了控制器,并替换了像这样的auth_options方法
def auth_options
{ :scope => resource_name, :recall => "Home#new" }
end
它可以解决问题,但网址仍为/ users / sign_in
我也会尝试解决这个问题。
答案 3 :(得分:1)
您可以更改默认的sign_in路径。
查看https://github.com/plataformatec/devise/wiki/How-To:-Change-the-default-sign_in-and-sign_out-routes
答案 4 :(得分:0)
在阐述Marcao的答案时,我强烈建议在CustomFailure响应方法中放置一些debugger,以便更好地了解正在发生的事情。
Class CustomFailure < Devise::FailureApp
def respond
binding.pry
super
end
end
如果您查看响应方法的FailureApp Devise Source Code,则可以非常轻松地了解正在发生的事情。
def respond
if http_auth?
http_auth
elsif warden_options[:recall]
recall
else
redirect
end
end
例如,为了返回redirect_url,您需要确保respond
代码条件最终返回redirect
。
但是,如果您想要返回http_auth方法中定义的标准401状态,则需要验证respond
方法代码是否返回http_auth
。
因此,值得您研究http_auth?
的定义
特别要注意:request.xhr?
方法,它将为json请求返回0(回想一下0实际上在ruby中的计算结果为true)
def http_auth?
if request.xhr?
Devise.http_authenticatable_on_xhr
else
!(request_format && is_navigational_format?)
end
end
也许检查config.http_authenticatable_on_xhr
或config.navigational_formats
的初始值设定项/设计文件,以便控制所需的响应。这种配置确实可以影响Devise返回的内容,并且由于它在幕后所做的事情,通常会导致意外的行为。