我正在尝试使用devise进行ajax登录,但似乎无法正常工作。问题是我在设计warden.authenticate上启用了可确认的策略!应该在不事件的用户上失败并呈现failure
操作,而是呈现默认操作。我注意到许多教程具有相同的设置。我正在使用Rails 4.0.0并设计3.2.2。
class SessionsController < Devise::SessionsController
def create
#problem: failure not getting called
resource = warden.authenticate!(scope: resource_name, recall: "#{controller_path}#failure")
sign_in(resource_name, resource)
render json: {success: true}
end
def failure
render json: {success: false, errors: ["Login failed!"]}
end
end
devise.rb设置如下,
config.http_authenticatable_on_xhr = false
config.navigational_formats = ['*/*', :'*/*', :html, :json]
route.rb具有以下内容,
devise_for :users, controllers: {registrations: "registrations", sessions: "sessions"}
登录表单,
<%= form_for(resource, as: resource_name,
url: session_path(resource_name),
format: :json,
html:{id:"signin_form"},
remote: true) do |f| %>
<%= f.label(:email, "Email") %>
<%= f.text_field(:email, class: "field text") %>
<%= f.label(:password, "Password") %>
<%= f.text_field(:password, class: "field text", id: "user_signin_password") %>
<%= f.submit "Sign in", class: "theme_color btn key" %>
<% end %>
由于未调用
failure
操作,因此默认的new
操作将使用响应 header 呈现,如下所示,Content-Type text/html; charset=utf-8
Location http://localhost:3000/users/sign_in.js
我也很好奇为什么它呈现
.js
而不是.json
。有人可以指出我错过的内容吗?谢谢
最佳答案
花了几个小时调试应用程序后,我发现devise的activatable.rb文件中存在一个错误。当我跟随这些选项时,发现该设备的注册钩子(Hook)after_set_user
不会随recall
选项一起抛出。
这似乎仅发生在试图使用现有电子邮件/用户名登录的非事件帐户(已启用可确认策略,但尚未确认帐户)时。但是,如果尝试使用不存在的电子邮件/用户名登录,则上述操作确实可以通过authenticate!
选项与recall
throws:warden一起使用。
我很高兴有人也发现了相同的错误并提供了补丁,但很好奇为什么他们不将其合并。
可以找到解决方案
here!
关于ruby-on-rails - 监护人认证召回没有被召唤,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20390617/