2013-01-20 16 views
6

Sinatra HTTP auth'ını nasıl oluşturabileceğime dair herhangi bir fikrin, modüler bir Sinatra uygulamasında sadece bir sayfada görüntülenmesi mümkün mü?Ekran Sinatra Temel HTTP Auth Tek Sayfada Sadece

+1

Sorunuz net değil kullanımı çok basit. Lütfen [açıkça belirtin ve SSS'de belirtildiği gibi ayrıntıları ve bağlamı ekleyin] (http://stackoverflow.com/questions/how-to-ask), böylece diğer kullanıcılar size etkili bir şekilde yardımcı olabilir. –

cevap

9

HTTP Auth (Basic auth'ı varsayıyorum) istemiş olduğunuza göre @iain yanıtına ekleme.

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

İyi şeyler, +1. Ayrıca, [[CUSTOM_USERNAME], "SECRET_PASSWORD"] 'i [ENV [" CUSTOM_USERNAME "], ENV [" SECRET_PASSWORD "]]' i değiştirmenizi ve bunları şifrelerin aktarılmaması için sunucunun ortamına yüklemenizi tavsiye ederim. kodda ve kaynak denetimi vb. aracılığıyla – iain

+1

Aslında kodu basit bir şekilde kodlamak için sabit kodlanmış değere değiştirdim. Bunu belirtmek daha mantıklı geliyor :). – ch4nd4n

3

Vicky Chijwani'nin yorumu doğrudur, çok daha fazla bilgi vermelisiniz (not alın!) Ama işte bir cevap.

Bunu çeşitli yollarla yapabilirsiniz. Biz kabul edersek kimlik doğrulama yöntemi protected! denir:

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 

Yoksa sinatra-contrib gem (gelişmiş bir kullanım belki biraz daha fazla Sinatra::Namespace kullanacağız eğer 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 

Veya kullanabilirsiniz ama bunu yapmak için güzel bir yol buluyorum ve bunu korumalı sayfa şimdi "/ admin-only-this-page-has-auth" adresinde olacaktı: