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 .