2014-04-25 78 views
0

我正在寫的應用程序有能力出現登錄彈出窗口,並通過硬編碼的用戶名/密碼常量對進行身份驗證。我想通過我們的中央LDAP服務器進行身份驗證。我們沒有基礎,但是我們有一個「cn = USERFOO,ou = it,o = corporate」的bind_dn字符串。變量user/pass通過基本登錄框傳入。使用紅寶石Webrick HTTPAuth與LDAP

我試圖通過ActiveLdap來做到這一點,但我不介意使用任何其他庫,只要我可以驗證通過單一登錄證書憑證對我們的LDAP服務器使用HTTPAuth,因爲完全寫在Webrick Ruby。以下是我正在調用的函數的示例。 有沒有人有任何想法如何做到這一點? 在此先感謝。

def authenticate_ldap(req,res) 
    authlabel = "LDAP Authentication" 
    HTTPAuth.basic_auth(req, res, authlabel) { |user, pass| 
     ActiveLdap::Base.setup_connection(
     :host => 'ldap.internalserver.com', 
     :port => 389, 
     :bind_dn => "cn=#{user},ou=it,o=corporate", 
     :password_block => Proc.new { pass }, 
    ) 
    } 
    return 
end 
+0

我不清楚你的實際問題是什麼。 – iain

+0

我基本上試圖創建一個彈出框,要求輸入用戶名和密碼,以便使用HTTPAuth或其他非導軌方式對中央LDAP服務器進行身份驗證。我可以在webrick中使用GET/POST,但是我仍然無法使用任何庫對LDAP服務器進行身份驗證。問題是其他人使用了什麼,以及他們的語法來完成這項任務。 –

+0

當你運行上面的代碼時會發生什麼?錯誤信息?時間到..? – iain

回答

1

我想出了一個解決方案。管理我們的LDAP服務器的人提供了不正確的ldap連接字符串,但即使這樣,它仍然不起作用。

我發現的解決方案的確與非常基本的驗證建立了聯繫,這對於那些對純Ruby中非常簡單的ldap身份驗證彈出窗口感興趣的任何人來說都是有效的。

def authenticate(req,res) 
    authlabel = 'LDAP Authentication' 
    HTTPAuth.basic_auth(req, res, authlabel) { |user, pass| 
    if pass.to_s != '' 
     ldap = Net::LDAP.new 
     ldap.host = "ldap.serverfoo.com" 
     ldap.port = 389 
     result = ldap.bind_as(
      :base => "t=basetreefoo", 
      :filter => "uid=#{user}", 
      :password => pass 
    ) 
     if result 
     ldap = Net::LDAP.new :host => "ldap.serverfoo.com", 
           :port => "389", 
           :auth => { 
            :method => :simple, 
            :username => "", 
            :password => "" 
           } 

     group_name = Net::LDAP::Filter.eq("cn", "#{user}") 
     group_type = Net::LDAP::Filter.eq("groupmembership", "cn=infra,ou=IT,o=Corporate") 
     filter = group_name & group_type 
     treebase = "t=basetreefoo" 
     ldap.search(:base => treebase, :filter => filter) do |entry| 
      if entry.dn.to_s != "" 
      puts 'success' 
      return 
      end 
     end 
     end 
    end 
    puts 'fail' 
    } 
end