LDAP через Ruby или Rails - PullRequest
       25

LDAP через Ruby или Rails

44 голосов
/ 02 декабря 2008

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

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

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

Ответы [ 6 ]

39 голосов
/ 16 апреля 2011

Вот пример кода, который я использую с гемом 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 превращает массив из одной строки в строку для полного имени пользователя.

8 голосов
4 голосов
/ 22 декабря 2008

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

У меня был похожий опыт использования серверов 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 связываться с доменом, используя их учетные данные, если я улавливаю исключение, то вход в систему завершился неудачно, в противном случае впустите их.

3 голосов
/ 20 января 2012

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

@ Решение Phrogz работает хорошо, но bind_simple (внутри bind) вызывает исключение 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 }
2 голосов
/ 05 февраля 2009

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

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

1 голос
/ 03 декабря 2008

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

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

...