如何进行非常简单的Sinatra LDAP身份验证?

时间:2013-04-05 09:38:19

标签: ruby ldap sinatra

我查看了Sinatra文档,他们似乎只引用了HTTP身份验证。我正在寻找一种非常简单的方法来控制基于通过LDAP服务器授权/验证的用户对路由的访问。

我已经构建了一个执行LDAP位的类,如果用户已成功通过身份验证,则返回一个LDAP对象,如果没有,则返回nil:

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

我可以使用它来确定它们是否已成功通过身份验证。

作为下一步,我想将其拼接成一个简单的Sinatra应用程序,该应用程序提供一个表单来收集LDAP用户和密码:

require 'directoryUser'
require 'sinatra'

enable :sessions

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

然后我想只在“DirectoryUser”对象存在的情况下允许路由:

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

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

我花了好几个小时试图找到答案但到目前为止似乎找不到任何对我有用的东西。

1 个答案:

答案 0 :(得分:2)

我可能会选择这样的东西:

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