2014-01-22 3 views
1

Я пытаюсь изменить существующее приложение rails, которое использует программу для проверки на соединение LDAP. Мне нужно проверить несколько разных соединений LDAP. В основном моя база пользователей разделена между 2 или 3 различными активными каталогами, и я хотел бы иметь возможность предоставить массив объектов информации о соединении и пропустить их через соединения, пока не получит ответ или не сработает. Возможно ли это с разработкой?Несколько соединений LDAP с использованием

ответ

3

Это! Вид. Недавно я взломал решение, не уверен, поможет ли оно вам сейчас.

Во-первых, вам необходимо использовать devise_ldap_authenticatable. После того, как вы установили это, вы можете сделать некоторые обновления для метода initialize в файле connection.rb в этом камне, чтобы принять либо одну конфигурацию, либо многие из них.

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 

Далее, убедитесь, что файл ldap.yml что devise_ldap_authenticatable генерируемый настроен все соединения, в том числе области, при необходимости -

## 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

возможно упростить это решение, если у меня есть один хост (работает глобальный каталог) и несколько базовых конфиги для нескольких доменов? –

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 
Смежные вопросы