LDAP через Ruby или Rails

Я пытался подключить приложение Rails к ActiveDirectory. Я буду синхронизировать данные о пользователях между AD и базой данных, в настоящее время MySQL (но может превратиться в SQL Server или PostgreSQL).

Я проверил activedirectory-ruby, и он выглядит действительно глючным (для версии 1.0 !?). Он является оболочкой для Net :: LDAP, поэтому я попытался использовать это вместо него, но он действительно близок к фактическому синтаксису LDAP, и мне понравилась абстракция ActiveDirectory-Ruby из-за его синтаксиса, подобного ActiveRecord.

Есть ли элегантный инструмент типа ORM для сервера каталогов? Еще лучше, если бы существовал какой-то инструмент для создания лесов для LDAP (CRUD для пользователей, групп, организационных единиц и т. Д.). Затем я мог бы быстро интегрировать это с моим существующим кодом аутентификации через Authlogic и синхронизировать все данные.


person Clinton    schedule 02.12.2008    source источник


Ответы (6)


Вот пример кода, который я использую с гемом net-ldap для проверки логинов пользователей с сервера ActiveDirectory на моей работе:

require 'net/ldap' # gem install net-ldap

def name_for_login( email, password )
  email = email[/\A\w+/].downcase  # Throw out the domain, if it was there
  email << "@mycompany.com"        # I only check people in my company
  ldap = Net::LDAP.new(
    host: 'ldap.mycompany.com',    # Thankfully this is a standard name
    auth: { method: :simple, email: email, password:password }
  )
  if ldap.bind
    # Yay, the login credentials were valid!
    # Get the user's full name and return it
    ldap.search(
      base:         "OU=Users,OU=Accounts,DC=mycompany,DC=com",
      filter:       Net::LDAP::Filter.eq( "mail", email ),
      attributes:   %w[ displayName ],
      return_result:true
    ).first.displayName.first
  end
end

Код first.displayName.first в конце выглядит немного глупо, поэтому ему может быть полезно пояснить:

  • Net::LDAP#search всегда возвращает массив результатов, даже если вы в конечном итоге соответствуете только одному Вход. Первый вызов first находит первую (и предположительно единственную) запись, совпадающую с адресом электронной почты.

  • Net::LDAP::Entry, возвращаемый поиском, удобно позволяет вам получить доступ к атрибутам через имя метода, поэтому some_entry.displayName то же самое как some_entry['displayName'].

  • Каждый атрибут в Net::LDAP::Entry всегда является массивом значений, даже если присутствует только одно значение. Хотя было бы глупо иметь пользователя с несколькими значениями displayName, общий характер LDAP означает, что это возможно. Последний вызов first превращает массив из одной строки в строку для полного имени пользователя.

person Phrogz    schedule 16.04.2011
comment
Спасибо за поздний ответ. Мне больше не нужна эта информация, но этот синтаксис выглядит звездным и НАМНОГО короче, чем я пытался это сделать. Спасибо еще раз! - person Clinton; 18.04.2011
comment
Спасибо, что разместили это. Я бился о стену просто потому, что не включил @ company.com в качестве имени пользователя. Ваш пост направил меня в правильном направлении. - person Chris Mendla; 02.05.2016

Вы пробовали смотреть на это:

http://saush.wordpress.com/2006/07/18/rubyrails-user-authentication-with-microsoft-active-directory/.

http://xaop.com/blog/2008/06/17/simple-windows-active-directory-ldap-authentication-with-rails/.

person mrTomahawk    schedule 19.12.2008
comment
mrT - Многие ссылки, которые предположительно когда-то работали в вашем ответе, теперь не работают. Можно ли убедить вас обновить их? Заранее спасибо. - person Chris Markle; 08.01.2010
comment
новый способ аутентификации с помощью ссылки ldap: wiki.rubyonrails.org/rails/pages/ - person Charles Ma; 15.10.2010

Это скорее анекдотический, чем реальный ответ ...

У меня был аналогичный опыт использования Samba и сервера OpenLDAP. Я не мог найти библиотеку, чтобы действительно делать то, что хотел, поэтому я создал свои собственные вспомогательные классы.

Я использовал ldapbrowser, чтобы увидеть, какие поля Samba заполнил при создании пользователь "официальным" способом и в основном это дублирует.

Единственная сложная / нестандартная вещь LDAP - это сумасшедшее шифрование паролей, которое у нас есть:

userPass:

"{MD5}" + Base64.encode64(Digest::MD5.digest(pass))

sambaNTPassword:

OpenSSL::Digest::MD4.hexdigest(Iconv.iconv("UCS-2", "UTF-8", pass).join).upcase

Для функции def authenticate(user, pass) я пытаюсь заставить LDAP привязаться к домену, используя их учетные данные, если я поймаю исключение, то логин не удался, в противном случае впустил их.

person Lolindrath    schedule 22.12.2008
comment
+1 Спасибо, искал способ сгенерировать хеш пароля nt в ruby ​​:) - person chmeee; 14.07.2009

Извините, пока не могу комментировать ... возможно, кто-то сможет это соответствующим образом переместить.

Решение @ Phrogz работает хорошо, но bind_simple (внутри привязки) вызывает исключение Net :: LDAP :: LdapError из-за того, что auth [: username] не установлен, как показано здесь:

https://github.com/ruby-ldap/ruby-net-ldap/blob/master/lib/net/ldap.rb

Исправленное заменяет:

auth: { method: :simple, email: email, password:password }

с участием:

auth: { method: :simple, username: email, password:password }
person jordanpg    schedule 20.01.2012
comment
Кстати, вы можете редактировать посты других людей - правки попадут в очередь «Предлагаемые правки», где два человека могут подтвердить или отклонить правильность редактирования. :) - person sarnold; 18.02.2012

Я начал использовать ruby-activedirectory и даже расширил его / исправил несколько вещей, разместив на Github каталог judy-active.

Выполняя следующую итерацию, я обнаружил, что ActiveLdap имеет гораздо лучшую кодовую базу, и я серьезно подумываю о переходе на нее. У кого-нибудь есть личный опыт с этим?

person Clinton    schedule 04.02.2009

Вы проверили ldap-activerecord-gateway от Thinkbot? Возможно, вам стоит подумать ...

http://github.com/gotitbot/ldap-activerecord-gateway/tree/master

person Community    schedule 02.12.2008
comment
Хм. Я все еще пытаюсь понять, что это может для нас сделать. По сути, я бы запускал этот ldap-сервер при запуске приложения rails. Затем, если есть способ реплицировать данные между этим и реальным сервером AD, сделайте это. Затем используйте мой ldap-сервер для данных. Имеет ли это смысл? - person Clinton; 03.12.2008