我正在尝试实现'禁用用户'功能。从各种来源我已经读过,可以通过我的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传递给前端用户。
答案 0 :(得分:1)
这是因为调用active_for_authentiction时warden.authenticate不会抛出带有选项的失败响应。它简单地将超级方法称为失败,并且不会抛出给出“召回”的选项。我发现了一个补丁。你必须覆盖设计。解决方案是here