拦截设计active_for_authentication错误消息

时间:2014-03-10 14:15:01

标签: ruby-on-rails ruby devise

我正在尝试实现'禁用用户'功能。从各种来源我已经读过,可以通过我的user.rb

跟随
  def active_for_authentication?
    super && disabled_at.blank?
  end

  def inactive_message
   'Your account has been disabled.'
  end

这很好用,在用户被禁用后,它会将他签出并指向sign_in页面并显示正确的非活动消息。

但是,当用户尝试登录(通过ajax)时,会发生以下情况:

Request URL:http://localhost:3000/users/sign_in
Request Method:POST
Status Code:302 Moved Temporarily

但在服务器控制台中实际上是

Completed 401 Unauthorized in 132ms

这是我的sessions_controller.rb

def create
  self.resource = warden.authenticate!(scope: resource_name, recall: "#{controller_path}#failure_with_ajax")
  sign_in(resource_name, resource)
  trial_mode_days_left?(resource)
  render json: { redirect: root_path }, status: :ok
end

def failure_with_ajax
   render json: { error: t('devise.failure.invalid') }, status: :unprocessable_entity
end

问题是当用户被禁用时,永远不会调用failure_with_ajax,但是在输入的凭据时它正常工作是错误的。我不知道为什么当active_for_authentication为false时触发召回,以及如何将inactive_message传递给前端用户。

1 个答案:

答案 0 :(得分:1)

这是因为调用active_for_authentiction时warden.authenticate不会抛出带有选项的失败响应。它简单地将超级方法称为失败,并且不会抛出给出“召回”的选项。我发现了一个补丁。你必须覆盖设计。解决方案是here