Выборочно разрешить некоторые URL-адреса через Rack:: Auth:: Basic

Я создал блог, в котором я хотел бы быть минимально обеспеченным (т.е. я просто хочу избегать случайных людей, которых я не знаю, я не пытаюсь реализовать меры безопасности, подобные NSA). Я использую toto с Rack:: Auth:: Basic, чтобы "защитить" сайт. Я хотел бы пройти через index.xml, чтобы читатели блога могли читать фид без обращения к паролю (и да, я знаю, что это большая дыра в моей "безопасности" ).

Как пропустить этот URL-адрес с помощью Rack:: Auth:: Basic?

Вот как я добавил базовый auth на свой сайт:

use Rack::Auth::Basic, "blog" do |username, password|
  [username, password] == ['generic', 'stupidanddumbpassword']
end

Ответ 1

Как насчет хорошего добродетельного наследования? Rack:: Auth:: Basic - простое приложение стойки (источник: https://github.com/rack/rack/blob/master/lib/rack/auth/basic.rb), поэтому можно переопределить метод #call и пропустить аутентификацию, когда путь запроса match '/index.xml':

class BlogAuth < Rack::Auth::Basic

  def call(env)
    request = Rack::Request.new(env)
    case request.path
    when '/index.xml'
      @app.call(env)  # skip auth
    else
      super           # perform auth
    end
  end

end

use BlogAuth, "blog" do |username, password|
  [username, password] == ['generic', 'stupidanddumbpassword']
end

Для получения дополнительной информации о стойке, проверьте: http://rack.rubyforge.org/doc/SPEC.html

Я не пробовал @Iain предложение о Rack:: URLMap, но похоже, что это тоже может быть хорошим вариантом.

Ответ 2

Спасибо за ответ!

Я тоже использовал это решение, но сделал небольшое изменение. потому что текущее решение, вероятно, приведет к дублированию кода, если для приложения потребуется более одного пути для доступа, Я изменил код на:

class AppBasicAuth < Rack::Auth::Basic
  def call(env)
    request = Rack::Request.new(env)
    allowed_paths = ['/api/v2/get_new.json']

    if allowed_paths.include? request.path
        @app.call(env)  # skip auth
    else
      super           # perform auth
    end
 end
end