2013-01-20 23 views
6

Bất kỳ ý tưởng làm thế nào tôi có thể làm cho Sinatra HTTP auth hiển thị chỉ trên một trang trong một ứng dụng mô-đun Sinatra?Hiển thị Sinatra Basic HTTP Auth On One Page Chỉ

+1

Câu hỏi của bạn không rõ ràng. Vui lòng [rõ ràng và thêm chi tiết và ngữ cảnh, như được đề cập trong Câu hỏi thường gặp] (http://stackoverflow.com/questions/how-to-ask) để những người dùng khác có thể giúp bạn hiệu quả. –

Trả lời

9

Thêm vào câu trả lời @iain, vì bạn đã hỏi Xác thực HTTP (Tôi giả định xác thực cơ bản).

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

Nội dung hay, +1. Tôi cũng khuyên bạn nên thay đổi '[" CUSTOM_USERNAME "," SECRET_PASSWORD "]' thành '[ENV [" CUSTOM_USERNAME "], ENV [" SECRET_PASSWORD "]]' và tải chúng vào môi trường của máy chủ để mật khẩu không được chuyển trong mã và thông qua kiểm soát nguồn, vv – iain

+1

Tôi thực sự đã thay đổi mã thành giá trị mã hóa cứng để làm cho nó đơn giản. Nó có ý nghĩa hơn để đề cập đến nó :). – ch4nd4n

3

Nhận xét của Vicky Chijwani là chính xác, bạn nên cung cấp nhiều thông tin hơn (lưu ý!) Nhưng đây là câu trả lời.

Bạn có thể thực hiện một số cách. Nếu chúng ta giả định phương pháp xác thực của bạn được gọi là 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 

Hoặc bạn có thể sử dụng 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 

Hoặc nếu bạn đang sử dụng Sinatra::Namespace từ sinatra-contrib gem (có thể nhiều hơn một chút một cách sử dụng tiên tiến , nhưng tôi sử dụng điều này rất nhiều khi tôi thấy đó là cách hay để làm việc) và trang được bảo vệ hiện có tại "/ 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 
2

Cách tốt nhất là sử dụng: https://rubygems.org/gems/sinatra-basic-auth Các tài liệu là rất tốt:

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 Nó thực sự đơn giản để sử dụng

Các vấn đề liên quan