2013-01-20 17 views
6

Jakiś pomysł jak mogę zrobić wyświetlacz auth Sinatra HTTP tylko na jednej stronie w modułowej aplikacji Sinatra?Wyświetlacz Sinatra Podstawowe HTTP Auth na jednej stronie tylko

+1

Twoje pytanie nie jest oczywista. Proszę [być jednoznaczne i dodaj szczegóły i kontekst, jak wspomniano w FAQ] (http://stackoverflow.com/questions/how-to-ask), dzięki czemu inni użytkownicy są w stanie skutecznie pomóc. –

Odpowiedz

9

Dodanie do odpowiedzi @iain, ponieważ zapytałeś o HTTP Auth (zakładam Basic auth).

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

Dobre rzeczy, +1. Chciałbym również zalecamy zmianę '[„CUSTOM_USERNAME”,„tajne_haslo”]' na '[ENV [„CUSTOM_USERNAME”] ENV [„tajne_haslo”]]' i ładuje je w środowisku serwera tak, że hasła nie są przekazywane wokół w kodzie i poprzez kontrolę kodu źródłowego itd. – iain

+1

Rzeczywiście zmieniłem kod na wartość zakodowaną, aby było prostsze. Warto wspomnieć o tym :). – ch4nd4n

3

Komentarz Vicky Chijwani jest prawidłowa, należy dać dużo więcej informacji (Uwaga!), Ale tutaj jest odpowiedź.

Można to zrobić na kilka sposobów. Jeśli zakładamy, że metoda uwierzytelniania jest nazywany 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 

Albo można użyć 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 

lub jeśli zamierzamy używać Sinatra::Namespace od sinatra-contrib gem (być może nieco bardziej zaawansowanego użycia , ale używam go bardzo często, ponieważ uważam, że jest to dobry sposób na robienie rzeczy) i strona chroniona będzie teraz dostępna w "/ admin/only-this-page-has-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 
Powiązane problemy