Custom Devise 401 несанкционированный ответ - PullRequest
19 голосов
/ 04 сентября 2011

Я работаю над JSON-API для моего приложения на Rails 3.1. Я хотел бы предоставить пользовательский ответ об ошибке вместо значения по умолчанию:

{"error":"You need to sign in or sign up before continuing."}

Мой контроллер API включает в себя вызов before_filter для authenticate_user!, который и обрабатывает этот ответ JSON.

Во время поиска я наткнулся на этот вопрос StackOverflow , который ссылается на эту вики-статью Devise . К сожалению, запись в вики не достаточно многословна, чтобы я мог понять, о чем она говорит. В частности, я понятия не имею, куда я должен поместить этот код так, чтобы Devise / Warden знал, как отобразить то, что я хочу вернуть.

Из комментариев на другой вопрос SA звучит так, будто мне не нужно звонить custom_failure!, так как я использую версию Devise выше 1.2 (1.4.2, если быть точным). Однако запись в вики не объясняет, куда должен идти вызов render, так что authenticate_user! знает, как использовать это вместо своего собственного вызова рендеринга.

Куда идет этот render звонок?

Редактировать: Я не просто пытаюсь изменить само сообщение (а-ля devise en.yml config); Я пытаюсь изменить фактический формат ответа. В частности, я хочу вернуть это:

render :text => "You must be logged in to do that.", :status => :unauthorized

Ответы [ 2 ]

22 голосов
/ 09 февраля 2016

Для справки, если кто-то еще наткнется на этот вопрос при поиске способа настройки реакции на ошибку json при неудачной попытке входа в систему с помощью Devise, ключом является использование собственной пользовательской реализации FailureApp.(Вы также можете использовать этот подход для переопределения некоторых действий перенаправления.)

class CustomFailureApp < Devise::FailureApp
  def respond
    if request.format == :json
      json_error_response
    else
      super
    end
  end

  def json_error_response
    self.status = 401
    self.content_type = "application/json"
    self.response_body = [ { message: i18n_message } ].to_json
  end
end

и в вашем devise.rb найдите раздел config.warden:

  config.warden do |manager|
    manager.failure_app = CustomFailureApp
  end

Некоторая связанная информация:

Сначала я подумал, что мне придется переопределить Devise :: SessionsController , возможно, используя опцию recall, переданную warden.authenticate!, но, как уже упоминалось, здесь , "отзыв не вызывается для запросов API, только для навигационных запросов. Если вы хотите настроить код состояния http, вам больше повезет, если вы сделаете это на уровне приложения сбоя."

Также https://github.com/plataformatec/devise/wiki/How-To%3a-Redirect-to-a-specific-page-when-the-user-can-not-be-authenticated показывает нечто очень похожее для перенаправления.

2 голосов
/ 06 сентября 2011

Если вы просто хотите изменить текст, отображаемый с сообщением об ошибке, я думаю, вы можете просто отредактировать файл локали (/config/locales/devise.en.yml).

RailsCast по этой теме также может быть полезен, если вам нужны более конкретные детали. Вы можете найти его на http://railscasts.com/episodes/210-customizing-devise

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...