我查看了Sinatra文档,他们似乎只引用了HTTP身份验证.我正在寻找一种非常简单的方法来控制基于通过LDAP服务器授权/验证的用户对路由的访问.
我已经构建了一个执行LDAP位的类,如果用户已成功通过身份验证,则返回一个LDAP对象,如果没有,则返回nil:
>>DirectoryUser.authenticate('user', 'password')
#<DirectoryUser:0x007ffb589a2328>
Run Code Online (Sandbox Code Playgroud)
我可以使用它来确定它们是否已成功通过身份验证.
作为下一步,我想将其拼接成一个简单的Sinatra应用程序,该应用程序提供一个表单来收集LDAP用户和密码:
require 'directoryUser'
require 'sinatra'
enable :sessions
get '/form' do
username = params[:username]
password = params[:password]
haml :form
end
Run Code Online (Sandbox Code Playgroud)
然后我想只允许路由,如果'DirectoryUser'对象存在:
get '/protected' do # Only if DirectoryUser object exists
"This route is protected"
end
get '/unprotected' do
"This route is unprotected"
end
Run Code Online (Sandbox Code Playgroud)
我花了好几个小时试图找到答案,但到目前为止,似乎找不到任何适合我的方法.
我可能会选择这样的东西:
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
Run Code Online (Sandbox Code Playgroud)