Выборочно разрешить некоторые 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