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
risposta
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
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
Ho effettivamente modificato il codice in base al valore hard coded per renderlo semplice. Ha più senso menzionarlo :). – ch4nd4n
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
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
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. –