Rails 2.x предоставляет значимое сообщение об ошибке при базовой аутентификации http - PullRequest
0 голосов
/ 03 июня 2010

Я использую обычную http-аутентификацию в своем приложении rails с помощью следующего кода:

class ApplicationController < ActionController::Base
  helper :all # include all helpers, all the time
  before_filter :authenticate

private
  def authenticate
    authenticate_or_request_with_http_basic do |username, password|
      if username.nil? || password.nil?
        render :inline => %(xml.instruct! :xml, :version => "1.0", :encoding => "UTF-8"
                            xml.errors do
                              xml.error('Could not authenticate you.')
                            end), :type => :builder, :status => 401
      end
    end
  end
end

Проблема в том, что если вы выполните curl http://127.0.0.1:3000/foo/1.xml без указания флага -u username: password, вы получите полный ответ, такой как:

HTTP/1.1 401 Unauthorized 
Cache-Control: no-cache
WWW-Authenticate: Basic realm="Foo"
X-Runtime: 1
Content-Type: text/html; charset=utf-8
Content-Length: 27
Server: WEBrick/1.3.1 (Ruby/1.9.1/2010-01-10)
Date: Thu, 03 Jun 2010 03:09:18 GMT
Connection: Keep-Alive

HTTP Basic: Access denied.

Можно ли вообще отобразить встроенный XML, который есть у меня выше, если имя пользователя и пароль не предоставлены пользователем?

1 Ответ

0 голосов
/ 03 июня 2010

Возможно, это не самый безопасный способ сделать это, но вы можете дать ему шанс.

Сначала сделайте пользовательскую ошибку:

#construct a custom error class
class AuthenticationError < StandardError
  # error code goes here
end

Теперь в вашем блоке кода выведите эту ошибку:

xml.errors do
  raise AuthenticationError
end

Теперь вы можете использовать метод rescue_from в ActionController для обработки вашего сообщения об ошибке:

class ApplicationController < ActionController::Base
  rescue_from AuthenticationError { |e| xml_status_error(:unauthorized, e) }

  def xml_status_error(status,exception)
    respond_to do |format|
      format.xml { #here you go! }
      format.any { head status } #just return the status code
    end
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...