Использовать дайджест-аутентификацию HTTP для одного маршрута
Я хотел бы использовать HTTP Digest аутентификацию для конкретного маршрута в моем модульном приложении Sinatra.
Примеры, приведенные на веб-сайте рецептов sinatra, просто описывают, как включить дайджест-аутентификацию для всего приложения. Решение, предложенное для того, чтобы заставить это работать для определенных маршрутов, состоит в создании двух отдельных приложений (одно с дайджест-аутентификацией, а другое без), помещая защищенные и незащищенные маршруты в их соответствующие приложения.
Это потребует что-то вроде следующего:
require 'sinatra/base'
class Protected < Sinatra::Base
use Rack::Auth::Basic, "Protected Area" do |username, password|
username == 'foo' && password == 'bar'
end
get '/' do
"secret"
end
end
class Public < Sinatra::Base
get '/' do
"public"
end
end
Это кажется излишним для меня.
Есть ли способ защитить отдельный маршрут в модульном приложении sinatra без необходимости создания совершенно нового приложения?
В FAQ есть пример, который ссылается на создание экземпляра Rack::Auth::Basic::Request и передачу в окружение, но выполнение чего-то подобного с использованием дайджест-аутентификации будет сильно отличаться и будет представлять собой гораздо большую процедуру ручной аутентификации.
Вот базовый пример аутентификации:
def authorized?
@auth ||= Rack::Auth::Basic::Request.new(request.env)
@auth.provided? &&
@auth.basic? &&
@auth.credentials &&
@auth.credentials == ['admin', 'admin']
end
У кого-нибудь есть мысли о том, как это можно сделать?
1 ответ
Использование перед фильтрами. Вам нужно другое поведение для одного и того же маршрута?