Учебники

Ruby — учебник LDAP

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 .