Базовая аутентификация Rails 2.x http - PullRequest
0 голосов
/ 03 июня 2010

Я пытаюсь заставить базовую http-аутентификацию работать в моем приложении Rails. Я предлагаю простой интерфейс REST, обслуживаемый сервером Rails, только вывод xml / json.

Каждый метод требует аутентификации, поэтому я помещаю фильтр аутентификации в ApplicationController:

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

protected
  def authenticate
    authenticate_or_request_with_http_basic do |u, p|
      true
    end
  end
end

Даже если метод возвращает true, я получаю 401 с сервера:

$ curl http://127.0.0.1:3000/myresource/1.xml -i
HTTP/1.1 401 Unauthorized 
Cache-Control: no-cache
WWW-Authenticate: Basic realm="Application"
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 02:43:55 GMT
Connection: Keep-Alive

HTTP Basic: Access denied.

Если я явно возвращаю истину, но получаю 401.

Ответы [ 2 ]

1 голос
/ 03 июня 2010

вы должны указать пару логин / пароль, даже если вы их не проверяете

curl http://127.0.0.1:3000/myresource/1.xml -i -u username:password
0 голосов
/ 04 июня 2010

Если вы хотите показать сообщение об ошибке для запросов XML, вы можете написать свой собственный before_filter:

class ApplicationController < ApplicationController::Base
  before_filter :authenticate

  def authenticate
    authentication_procedure = lambda do |username, password|
      # test username and password
    end
    authenticate_with_http_basic(&authentication_procedure) ||
      request_http_basic_authentication_or_show_xml_error(&authentication_procedure)
  end

  def request_http_basic_authentication_or_show_xml_error(&auth_proc)
    if request.format == Mime::XML
      render :action => '/errors/401'
    else
      request_http_basic_authentication('My Realm')
    end
  end
end

Затем положите что-нибудь в app/views/errors/401.xml.builder.

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