2014-01-22 77 views
1

我試圖修改現有的使用設計檢查LDAP連接的rails應用程序。我需要檢查多個不同的LDAP連接。基本上我的用戶羣分爲兩個或三個不同的活動目錄,我希望能夠提供一組連接信息對象,並通過連接運行,直到獲得響應或失敗。這可能與設計?設計多個LDAP連接

回答

3

這是!有點。我最近一起攻擊了一個解決方案,不確定它現在對你有多大幫助。

首先,您需要使用devise_ldap_authenticatable。安裝完成後,您可以對此gem中的connection.rb文件中的initialize方法進行一些更新,以接受一個配置或多個配置。

def initialize(params = {}) 
    ldap_configs = YAML.load(ERB.new(File.read(::Devise.ldap_config || "#{Rails.root}/config/ldap.yml")).result)[Rails.env] 
    ldap_configs = ldap_configs.is_a?(Hash) ? [ldap_configs] : ldap_configs 

下一部分由您決定。由於我的約束(兩個目錄中存在用戶名),我強制用戶在循環連接之前輸入一個有效的域。你可能沒有這個約束。無論哪種情況,只需循環配置即可。一旦你成功綁定,打破循環。該配置值將存儲在這裏初始化的變量@ldap -

ldap_configs.each do |ldap_config| 
    #Maybe not needed if you don't have usernames in each directory. @domain is a user-entered value  
    if @domain == ldap_config["domain"] 
     #This should all stay the same, until you check the bindings 

      if @ldap.bind 
      #If it binds, break the loop. the values in @ldap will be stored 
      break 
      else 
      #keep looping 
      end 
    end 
end 

接下來,確保devise_ldap_authenticatable生成配置了所有的連接,包括域名的,如果需要的話ldap.yml文件 -

## Environment 

development: 
- 
    host: "localhost1.com" 
    port: "389" 
    attribute: uid 
    base: dc=my-domain,dc=com 
    admin_user: cn=admin,dc=my-domain,dc=com 
    admin_password: admin_password 
    ssl: false 
    domain: "FIRST" 
- 
    host: "localhost2.com" 
    port: "389" 
    attribute: uid 
    base: dc=my-domain,dc=com 
    admin_user: cn=admin,dc=my-domain,dc=com 
    admin_password: admin_password 
    ssl: false 
    domain: "SECOND" 
+0

是可能的,如果我有一個主機(運行全局編錄),多基地CONFIGS爲多個域,以簡化這個解決方案? –

0

我建立在史蒂夫的回答下面,似乎工作得很好。這樣做的好處是它包裝了原始代碼併爲其添加了功能。您可以保持ldap.yml文件相同,並添加一個hosts密鑰以及YAML的一組主機來執行此操作。

請注意,我挽救了循環中的連接錯誤。當它試圖再次建立圖書館已經試圖建立的聯繫時,它仍然會拋出。

module Devise 
    module LDAP 
    module ConnectionExtensions 
     def initialize(params = {}) 
     super 
     ldap_config = YAML.load(File.read("#{Rails.root}/config/ldap.yml"))[Rails.env] 
     ldap_config["hosts"]&.each do |host| 
      begin 
      @ldap.host = host 
      break if @ldap.bind 
      rescue Net::LDAP::Error => e 
      DeviseLdapAuthenticatable::Logger.send(e) 
      next 
      end 
     end 
     end 
    end 

    class Connection 
     prepend ConnectionExtensions 
    end 
    end 
end 

這裏是樣本YAML文件:

development: 
    host: localhost1.com 
    hosts: 
    - localhost1.com 
    - localhost2.com 
    port: 389 
    attribute: uid 
    base: dc=my-domain,dc=com 
    admin_user: cn=admin,dc=my-domain,dc=com 
    admin_password: admin_password 
    ssl: false