2013-02-09 44 views
11

रेल 3.2 का उपयोग करना।कुछ (सभी नहीं) नियंत्रकों के लिए HTTP बेसिक ऑथ

मेरे पास आधा दर्जन नियंत्रक हैं, और कुछ (लेकिन सभी नहीं) http_basic_authenticate_with के साथ उनकी रक्षा करना चाहते हैं।

मैं मैन्युअल रूप से प्रत्येक नियंत्रक को http_basic_authenticate_with जोड़ना नहीं चाहता (मैं भविष्य में एक और नियंत्रक जोड़ सकता हूं और इसे सुरक्षित करना भूल सकता हूं!)। ऐसा लगता है कि इसका उत्तर application_controller.rb में :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' 

इस दृष्टिकोण का सबसे अच्छा तरीका क्या है मिल सकता है?

+2

एक विकल्प एक 'वर्ग ProtectedController

+0

यदि आप प्रमाणीकरण के लिए तैयार होने का उपयोग करते हैं, तो आप रेल के बजाय devise के साथ मूल लेख सक्षम कर सकते हैं - https://github.com/plataformatec/devise/wiki/How-To:-Use-HTTP-Basic- प्रमाणीकरण - शायद आपके मामले में प्रासंगिक नहीं है? – house9

+0

सर्जीओ, जो मुझे उसी स्थान पर वापस रखेगा जिसे मैं टालने की कोशिश कर रहा हूं - मुझे मैन्युअल रूप से प्रत्येक नए नियंत्रक को मैन्युअल रूप से जोड़ना होगा जिसे मैं संरक्षित करना चाहता हूं। अगर मैं ऐसा करने के लिए तैयार था, तो मैं बस प्रत्येक नियंत्रक में http_base_authenticate लाइन डाल सकता था। – shacker

उत्तर

23

रेलवे इसे करता है जिस तरह से करें।

# 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 
+0

और नहीं, आप केवल 'skip_before_action नहीं कर सकते: प्रमाणीकरण_or_request_with_http_basic'। मेरा विश्वास करो, मैंने कोशिश की। –

+2

यह स्वीकार्य उत्तर होना चाहिए – ianpetzer