Подтвердить что ты не робот

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'

Какой лучший способ приблизиться к этому?

4b9b3361

Ответ 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