Ruby / LDAP — это библиотека расширений для Ruby. Он предоставляет интерфейс для некоторых библиотек LDAP, таких как OpenLDAP, UMich LDAP, Netscape SDK, ActiveDirectory.
Общий API для разработки приложений описан в RFC1823 и поддерживается Ruby / LDAP.
Установка Ruby / LDAP
Вы можете скачать и установить полный пакет Ruby / LDAP с SOURCEFORGE.NET .
Перед установкой Ruby / LDAP убедитесь, что у вас есть следующие компоненты —
- Ruby 1.8.x (как минимум 1.8.2, если вы хотите использовать ldap / control).
- OpenLDAP, Netscape SDK, Windows 2003 или Windows XP.
Теперь вы можете использовать стандартный метод установки Ruby. Перед началом, если вы хотите увидеть доступные опции для extconf.rb, запустите его с параметром —help.
$ ruby extconf.rb [--with-openldap1|--with-openldap2| \ --with-netscape|--with-wldap32] $ make $ make install
ПРИМЕЧАНИЕ. — Если вы собираете программное обеспечение для Windows, вам может потребоваться использовать nmake вместо make .
Установите соединение LDAP
Это двухэтапный процесс —
Шаг 1 — Создание объекта подключения
Ниже приведен синтаксис для создания соединения с каталогом LDAP.
LDAP::Conn.new(host = 'localhost', port = LDAP_PORT)
-
host — это идентификатор хоста, на котором работает каталог LDAP. Мы примем это как localhost .
-
порт — это порт, используемый для службы LDAP. Стандартные порты LDAP — 636 и 389. Убедитесь, какой порт используется на вашем сервере, иначе вы можете использовать LDAP :: LDAP_PORT.
host — это идентификатор хоста, на котором работает каталог LDAP. Мы примем это как localhost .
порт — это порт, используемый для службы LDAP. Стандартные порты LDAP — 636 и 389. Убедитесь, какой порт используется на вашем сервере, иначе вы можете использовать LDAP :: LDAP_PORT.
Этот вызов возвращает новое соединение LDAP :: Conn с сервером, хостом , портом порта .
Шаг 2 — Связывание
Здесь мы обычно указываем имя пользователя и пароль, которые будем использовать до конца сеанса.
Ниже приведен синтаксис для привязки соединения LDAP с использованием DN, dn , учетных данных, pwd и метода связывания, метод —
conn.bind(dn = nil, password = nil, method = LDAP::LDAP_AUTH_SIMPLE)do .... end
Вы можете использовать тот же метод без блока кода. В этом случае вам необходимо явно отсоединить соединение следующим образом:
conn.bind(dn = nil, password = nil, method = LDAP::LDAP_AUTH_SIMPLE) .... conn.unbind
Если задан кодовый блок, self передается блоку.
Теперь мы можем выполнять операции поиска, добавления, изменения или удаления внутри блока метода bind (между bind и unbind), если у нас есть соответствующие разрешения.
пример
Предполагая, что мы работаем на локальном сервере, давайте соединим вещи с соответствующим хостом, доменом, идентификатором пользователя и паролем и т. Д.
#/usr/bin/ruby -w require 'ldap' $HOST = 'localhost' $PORT = LDAP::LDAP_PORT $SSLPORT = LDAP::LDAPS_PORT conn = LDAP::Conn.new($HOST, $PORT) conn.bind('cn = root, dc = localhost, dc = localdomain','secret') .... conn.unbind
Добавление записи LDAP
Добавление записи LDPA является двухэтапным процессом —
Шаг 1 — Создание объекта LDAP :: Mod
Чтобы создать запись, нам нужно передать объект LDAP :: Mod в метод conn.add . Вот простой синтаксис для создания объекта LDAP :: Mod —
Mod.new(mod_type, attr, vals)
-
mod_type — одна или несколько опций LDAP_MOD_ADD, LDAP_MOD_REPLACE или LDAP_MOD_DELETE.
-
attr — должно быть именем атрибута, с которым нужно работать.
-
vals — это массив значений, относящихся к attr . Если vals содержит двоичные данные, mod_type должен быть логически ИЛИ (|) с LDAP_MOD_BVALUES.
mod_type — одна или несколько опций LDAP_MOD_ADD, LDAP_MOD_REPLACE или LDAP_MOD_DELETE.
attr — должно быть именем атрибута, с которым нужно работать.
vals — это массив значений, относящихся к attr . Если vals содержит двоичные данные, mod_type должен быть логически ИЛИ (|) с LDAP_MOD_BVALUES.
Этот вызов возвращает объект LDAP :: Mod , который может быть передан методам в классе LDAP :: Conn, таким как Conn # add, Conn # add_ext, Conn # modify и Conn # modify_ext.
Шаг 2 — Вызов метода conn.add
Когда мы будем готовы с объектом LDAP :: Mod , мы можем вызвать метод conn.add для создания записи. Вот синтаксис для вызова этого метода —
conn.add(dn, attrs)
Этот метод добавляет запись с DN, dn и атрибутами, attrs . Здесь attrs должен быть либо массивом объектов LDAP :: Mod, либо хэшем пар массивов атрибут / значение.
пример
Вот полный пример, который создаст две записи каталога —
#/usr/bin/ruby -w require 'ldap' $HOST = 'localhost' $PORT = LDAP::LDAP_PORT $SSLPORT = LDAP::LDAPS_PORT conn = LDAP::Conn.new($HOST, $PORT) conn.bind('cn = root, dc = localhost, dc = localdomain','secret') conn.perror("bind") entry1 = [ LDAP.mod(LDAP::LDAP_MOD_ADD,'objectclass',['top','domain']), LDAP.mod(LDAP::LDAP_MOD_ADD,'o',['TTSKY.NET']), LDAP.mod(LDAP::LDAP_MOD_ADD,'dc',['localhost']), ] entry2 = [ LDAP.mod(LDAP::LDAP_MOD_ADD,'objectclass',['top','person']), LDAP.mod(LDAP::LDAP_MOD_ADD, 'cn', ['Zara Ali']), LDAP.mod(LDAP::LDAP_MOD_ADD | LDAP::LDAP_MOD_BVALUES, 'sn', ['ttate','ALI', "zero\000zero"]), ] begin conn.add("dc = localhost, dc = localdomain", entry1) conn.add("cn = Zara Ali, dc = localhost, dc = localdomain", entry2) rescue LDAP::ResultError conn.perror("add") exit end conn.perror("add") conn.unbind
Изменение записи LDAP
Изменение записи аналогично добавлению. Просто вызовите метод модификации вместо add с атрибутами для модификации. Вот простой синтаксис метода модификации .
conn.modify(dn, mods)
Этот метод изменяет запись с DN, dn и атрибутами, модами . Здесь моды должны быть либо массивом объектов LDAP :: Mod, либо хэшем пар массивов атрибут / значение.
пример
Чтобы изменить фамилию записи, которую мы добавили в предыдущем разделе, мы написали бы:
#/usr/bin/ruby -w require 'ldap' $HOST = 'localhost' $PORT = LDAP::LDAP_PORT $SSLPORT = LDAP::LDAPS_PORT conn = LDAP::Conn.new($HOST, $PORT) conn.bind('cn = root, dc = localhost, dc = localdomain','secret') conn.perror("bind") entry1 = [ LDAP.mod(LDAP::LDAP_MOD_REPLACE, 'sn', ['Mohtashim']), ] begin conn.modify("cn = Zara Ali, dc = localhost, dc = localdomain", entry1) rescue LDAP::ResultError conn.perror("modify") exit end conn.perror("modify") conn.unbind
Удаление записи LDAP
Чтобы удалить запись, вызовите метод delete с отличительным именем в качестве параметра. Вот простой синтаксис метода удаления .
conn.delete(dn)
Этот метод удаляет запись с DN, dn .
пример
Чтобы удалить запись Zara Mohtashim , которую мы добавили в предыдущем разделе, мы написали бы —
#/usr/bin/ruby -w require 'ldap' $HOST = 'localhost' $PORT = LDAP::LDAP_PORT $SSLPORT = LDAP::LDAPS_PORT conn = LDAP::Conn.new($HOST, $PORT) conn.bind('cn = root, dc = localhost, dc = localdomain','secret') conn.perror("bind") begin conn.delete("cn = Zara-Mohtashim, dc = localhost, dc = localdomain") rescue LDAP::ResultError conn.perror("delete") exit end conn.perror("delete") conn.unbind
Изменение отличительного имени
Невозможно изменить отличительное имя записи с помощью метода modify . Вместо этого используйте метод modrdn . Вот простой синтаксис метода modrdn —
conn.modrdn(dn, new_rdn, delete_old_rdn)
Этот метод изменяет RDN записи с помощью DN, dn , давая ему новое RDN, new_rdn . Если delete_old_rdn имеет значение true , старое значение RDN будет удалено из записи.
пример
Предположим, у нас есть следующая запись —
dn: cn = Zara Ali,dc = localhost,dc = localdomain cn: Zara Ali sn: Ali objectclass: person
Затем мы можем изменить его отличительное имя с помощью следующего кода —
#/usr/bin/ruby -w require 'ldap' $HOST = 'localhost' $PORT = LDAP::LDAP_PORT $SSLPORT = LDAP::LDAPS_PORT conn = LDAP::Conn.new($HOST, $PORT) conn.bind('cn = root, dc = localhost, dc = localdomain','secret') conn.perror("bind") begin conn.modrdn("cn = Zara Ali, dc = localhost, dc = localdomain", "cn = Zara Mohtashim", true) rescue LDAP::ResultError conn.perror("modrdn") exit end conn.perror("modrdn") conn.unbind
Выполнение поиска
Чтобы выполнить поиск в каталоге LDAP, используйте метод поиска с одним из трех различных режимов поиска —
-
LDAP_SCOPE_BASEM — Искать только базовый узел.
-
LDAP_SCOPE_ONELEVEL — Поиск всех дочерних узлов базового узла.
-
LDAP_SCOPE_SUBTREE — Поиск по всему поддереву, включая базовый узел.
LDAP_SCOPE_BASEM — Искать только базовый узел.
LDAP_SCOPE_ONELEVEL — Поиск всех дочерних узлов базового узла.
LDAP_SCOPE_SUBTREE — Поиск по всему поддереву, включая базовый узел.
пример
Здесь мы будем искать все поддерево записи dc = localhost, dc = localdomain для объектов person —
#/usr/bin/ruby -w require 'ldap' $HOST = 'localhost' $PORT = LDAP::LDAP_PORT $SSLPORT = LDAP::LDAPS_PORT base = 'dc = localhost,dc = localdomain' scope = LDAP::LDAP_SCOPE_SUBTREE filter = '(objectclass = person)' attrs = ['sn', 'cn'] conn = LDAP::Conn.new($HOST, $PORT) conn.bind('cn = root, dc = localhost, dc = localdomain','secret') conn.perror("bind") begin conn.search(base, scope, filter, attrs) { |entry| # print distinguished name p entry.dn # print all attribute names p entry.attrs # print values of attribute 'sn' p entry.vals('sn') # print entry as Hash p entry.to_hash } rescue LDAP::ResultError conn.perror("search") exit end conn.perror("search") conn.unbind
Это вызывает данный блок кода для каждой соответствующей записи, где запись LDAP представлена экземпляром класса LDAP :: Entry. С последним параметром поиска вы можете указать атрибуты, которые вас интересуют, опуская все остальные. Если вы передадите здесь nil, все атрибуты будут возвращены так же, как «SELECT *» в реляционных базах данных.
Метод dn (псевдоним для get_dn) класса LDAP :: Entry возвращает различающееся имя записи, а с помощью метода to_hash вы можете получить хеш-представление его атрибутов (включая различающееся имя). Чтобы получить список атрибутов записи, используйте метод attrs (псевдоним для get_attributes). Также, чтобы получить список значений одного определенного атрибута, используйте метод vals (псевдоним для get_values).
Обработка ошибок
Ruby / LDAP определяет два разных класса исключений —
-
В случае ошибки методы new, bind или unbind вызывают исключение LDAP :: Error.
-
В случае добавления, изменения, удаления или поиска в каталоге LDAP возникает LDAP :: ResultError.
В случае ошибки методы new, bind или unbind вызывают исключение LDAP :: Error.
В случае добавления, изменения, удаления или поиска в каталоге LDAP возникает LDAP :: ResultError.
Дальнейшее чтение
Для получения полной информации о методах LDAP, пожалуйста, обратитесь к стандартной документации для документации LDAP .