14

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'

これにアプローチする最良の方法は何ですか?

4

1 に答える 1

45

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
于 2014-03-10T04:18:52.793 に答える