我正在尝试使用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/

10-14 01:40