2013-04-05 7 views
5

Tôi đã xem các tài liệu của Sinatra và chúng dường như chỉ tham chiếu đến xác thực HTTP. Tôi đang tìm một cách thực sự đơn giản để kiểm soát quyền truy cập vào các tuyến đường dựa trên người dùng được ủy quyền/xác thực qua máy chủ LDAP.Làm cách nào để thực hiện xác thực Sinatra LDAP thực sự đơn giản?

tôi đã xây dựng một lớp học mà không bit LDAP và trả về một đối tượng LDAP nếu người dùng đã được chứng thực và nil thành công nếu họ không có:

>>DirectoryUser.authenticate('user', 'password') 
#<DirectoryUser:0x007ffb589a2328> 

tôi có thể sử dụng để xác định xem họ đã được xác thực thành công hay không.

Là một bước tiếp theo tôi muốn ghép này thành một ứng dụng Sinatra đơn giản mà cung cấp một hình thức để thu thập người dùng LDAP và mật khẩu:

require 'directoryUser' 
require 'sinatra' 

enable :sessions 

    get '/form' do 
    username  = params[:username] 
    password  = params[:password] 
    haml :form 
    end 

Sau đó, tôi muốn chỉ cho phép các tuyến đường nếu đối tượng 'DirectoryUser' tồn tại:

get '/protected' do # Only if DirectoryUser object exists 
    "This route is protected" 
end 

get '/unprotected' do 
    "This route is unprotected" 
end 

tôi đã dành giờ cố gắng tìm câu trả lời cho điều này, nhưng cho đến nay và dường như không thể tìm thấy bất cứ điều gì mà làm việc cho tôi.

Trả lời

2

tôi có thể đi với một cái gì đó như thế này:

require 'directoryUser' 
require 'sinatra' 

enable :sessions 

helpers do 
    def authorize! 
    redirect(to('/login')) unless session[:user_id] 
    end 
end 

get '/login' do 
    haml :login # with the login form 
end 

post '/login' do 
    user = DirectoryUser.authenticate(params[:username], params[:password]) 

    if user 
    session[:user_id] = user.id 
    # Or: session[:logged_in] = true, depending on your needs. 
    redirect to('/protected') 
    else 
    redirect to('/login') 
    end 
end 

get '/protected' do 
    authorize! 
    'This route is protected' 
end 

get '/unprotected' do 
    'This route is unprotected' 
end 
+0

Superb! - Tôi sẽ thử nó ngay bây giờ và cho bạn biết làm thế nào nó đi. Cảm ơn vì đã phản hồi. – user1513388

+1

Điều này hoạt động hoàn hảo - cảm ơn bạn đã giúp đỡ! – user1513388