2011-11-01 2 views
6

Desidero implementare l'autenticazione di base HTTP sul mio server di staging, ma solo per quelli esterni alla rete locale. Ho un'applicazione Rails 3.1. In application.rb, ho il seguente:Autenticazione di base HTTP condizionale

class ApplicationController << ActionController::Base 
    http_basic_authenticate_with :realm => "Staging", :name => "user", :password => "password" if :need_authentication? 

private 

    def need_authentication? 
    Rails.env == "staging" && request.remote_addr !~ /^192.168.0.\d{1,3}$/ 
    end 

end 

Ecco il problema: anche quando il metodo need_authentication?esplicitamente rendimenti false, l'applicazione ancora mi chiede di autenticare, come se fosse completamente ignorando la clausola if alla fine.

Quindi, esiste un modo per richiedere l'autenticazione solo in determinate condizioni?

risposta

6

Questo è ciò che ha funzionato:

class ApplicationController < ActionController::Base 
    before_filter :authenticate_if_staging 

private 

    def authenticate_if_staging 
    if Rails.env == 'staging' && request.remote_addr !~ /^192.168.0.\d{1,3}$/ 
     authenticate_or_request_with_http_basic 'Staging' do |name, password| 
     name == 'username' && password == 'secret' 
     end 
    end 
    end 
end 

'Staging' è il nome del regno. Questo non è richiesto, ma può essere usato per chiarimenti.

-3

Prova questo:

class ApplicationController < ActionController::Base 
    before_filter :do_auth 

    def do_auth 
    http_basic_authenticate_with :realm => "Staging", :name => "user", :password => "password" if :need_authentication? 
    end 

private 

    def need_authentication? 
    Rails.env == "staging" && request.remote_addr !~ /^192.168.0.\d{1,3}$/ 
    end 

end 
+1

'http_basic_authenticate_with' è un metodo di classe. Ho provato a inserirlo in un altro metodo, come descritto sopra, ma ciò mi dà un'eccezione 'metodo non definito '. – partydrone

7

In Rails 4, la condizione: if funziona. Ad esempio,

class ApplicationController < ApplicationController::Base 
    http_basic_authenticate_with name: "user", password: "password" if Rails.env == 'staging' 
end 

o se si vuole un metodo di supporto per impostare la condizione,

class ApplicationController < ApplicationController::Base 
    http_basic_authenticate_with name: "user", password: "password", if: :need_authentication? 

    private 
    def need_authentication? 
    Rails.env == 'staging' 
    end 
end