HTTP Basic Auth для некоторых (не всех) контроллеров
Использование Rails 3.2.
У меня есть полдюжины контроллеров и вы хотите защитить некоторые (но не все) из них с помощью http_basic_authenticate_with
.
Я не хочу вручную добавлять http_basic_authenticate_with
к каждому контроллеру (я мог бы добавить еще один контроллер в будущем и забыть его защитить!). Кажется, ответ состоит в том, чтобы поместить его в application_controller.rb
с аргументом :except
, который будет перечислять контроллеры, которые не должны быть защищены. Проблема заключается в том, что: except: требуется имена методов, а не имена модулей внешнего контроллера, например:
http_basic_authenticate_with :name => 'xxx', :password => 'yyy', :except => :foo, :bar
Итак, я подумал: "Подождите, так как у меня уже есть защищенные контроллеры, сгруппированные в routes.rb
, пусть там будет там". Поэтому я пробовал это на своих маршрутах:
scope "/billing" do
http_basic_authenticate_with :name ...
resources :foo, :bar ...
end
Но теперь я получаю
undefined method `http_basic_authenticate_with'
Какой лучший способ приблизиться к этому?
Ответы
Ответ 1
Сделайте так, как это делает Rails.
# rails/actionpack/lib/action_controller/metal/http_authentication.rb
def http_basic_authenticate_with(options = {})
before_action(options.except(:name, :password, :realm)) do
authenticate_or_request_with_http_basic(options[:realm] || "Application") do |name, password|
name == options[:name] && password == options[:password]
end
end
end
Все, что делает http_basic_authenticate_with
, добавляет before_action
. Вы можете так же легко сделать то же самое:
# application_controller.rb
before_action :http_basic_authenticate
def http_basic_authenticate
authenticate_or_request_with_http_basic do |name, password|
name == 'xxx' && password == 'yyy'
end
end
что означает, что вы можете использовать skip_before_action
в контроллерах, где это поведение нежелательно:
# unprotected_controller.rb
skip_before_action :http_basic_authenticate