2013-01-20 11 views
6

Qualche idea su come posso rendere l'autenticazione di Sinatra HTTP solo su una pagina in un'applicazione Sinatra modulare?Mostra Autentica HTTP Sinatra Basic su una sola pagina

+1

tua domanda non è chiaro. Per favore [sii univoco e aggiungi dettagli e contesto, come menzionato nelle FAQ] (http://stackoverflow.com/questions/how-to-ask), in modo che altri utenti possano aiutarti in modo efficace. –

risposta

9

Aggiunta alla risposta @iain, poiché è stato richiesto l'autenticazione HTTP (presuppongo l'autenticazione di base).

class MyApp < Sinatra::Base 
    def authorized? 
    @auth ||= Rack::Auth::Basic::Request.new(request.env) 
    @auth.provided? && @auth.basic? && @auth.credentials && @auth.credentials == ["CUSTOM_USERNAME","SECRET_PASSWORD"] 
    end 

    def protected! 
    unless authorized? 
     response['WWW-Authenticate'] = %(Basic realm="Restricted Area") 
     throw(:halt, [401, "Oops... we need your login name & password\n"]) 
    end 
    end 

    get "/protected_content" do 
    protected! 
    "in secure" 
    end 

    get "/" do 
    "anyone can access" 
    end 
end 
+3

Roba buona, +1. Ti consigliamo anche di cambiare '[" CUSTOM_USERNAME "," SECRET_PASSWORD "]' in '[ENV [" CUSTOM_USERNAME "], ENV [" SECRET_PASSWORD "]]' e di caricarli nell'ambiente del server in modo che le password non vengano passate in giro nel codice e tramite il controllo del codice sorgente ecc. – iain

+1

Ho effettivamente modificato il codice in base al valore hard coded per renderlo semplice. Ha più senso menzionarlo :). – ch4nd4n

3

Il commento di Vicky Chijwani è corretto, dovresti dare molte più informazioni (prendi nota!) Ma ecco una risposta.

Si potrebbe fare in diversi modi. Se si assume il metodo di autenticazione viene chiamato protected!:

class MyApp < Sinatra::Base # assumed for all examples 

    get "/only-this-page-has-auth" do 
    protected! 
    "Only admin allowed!" 
    end 

    get "/this-wont-have-auth" do 
    "Everybody can access this" 
    end 
end 

Oppure si potrebbe usare a filter

before "/only-this-page-has-auth" do 
    protected! 
    end 

    get "/only-this-page-has-auth" do 
    "Only admin allowed!" 
    end 

    get "/this-wont-have-auth" do 
    "Everybody can access this" 
    end 

Oppure, se avete intenzione di usare Sinatra::Namespace dal sinatra-contrib gem (forse un po 'più di un uso avanzato , ma io uso questo molto come lo trovo un bel modo di fare le cose) e la pagina protetta sarebbe ora essere a "/ admin/solo-la-page-ha-auth"

namespace "/admin" do 
    before do 
     protected! 
    end 
    get "/only-this-page-has-auth" do 
     "Only admin allowed!" 
    end 
    end 

    get "/this-wont-have-auth" do 
    "Everybody can access this" 
    end 
2

Il modo migliore è quello di utilizzare: https://rubygems.org/gems/sinatra-basic-auth La documentazione è grande:

require "sinatra" 
require "sinatra/basic_auth" 

# Specify your authorization logic 
authorize do |username, password| 
    username == "john" && password == "doe" 
end 

# Set protected routes 
protect do 
    get "/admin" do 
    "Restricted page that only admin can access" 
    end 
end 

http://www.rubydoc.info/gems/sinatra-basic-auth/0.1.0 E 'veramente semplice da usare

Problemi correlati