Добавление элементов при помощи стандартных операций LDAP



Добавление элементов при помощи стандартных операций LDAP

На этот раз мы заглянем вглубь процесса добавления элементов, чтобы научиться создавать и заполнять элементы вручную, не считывая их из файла, как в прошлый раз. Два модуля обрабатывают этот процесс по-разному, поэтому работать с ними следует отдельно. Модуль Миilia:: LDAP ближе к классическому стилю объектно-ориентированного программирования. Создадим новый экземпляр объекта:

use Mozilla::LDAP::Entry;

$e = new Mozilla::LDAP::Entry()

и начнем его заполнять. Следующий шаг - дать элементу отличительное имя DN. Это можно сделать при помощи метода setDN():

$e->setDN("uid=jay,

ou=systems,

ou=people,

dc=ccs,

dc=hogwarts,

dc=edu");

Для заполнения других атрибутов, таких как objectClass, следует пойти по одному из двух путей. Можно сделать ряд предположений относительно структуры данных, используемой для представления элемента (по существу, это хэш списков), и заполнить ее напрямую:

$е->{сп} = ['Jay Sekora'];

В данном случае используется имя атрибута в качестве ключа хэша и ссылка на анонимный массив, хранящий данные. Модуль Mozilla: : LDAP ожидает, что значениями хэша будут ссылки на массив, а не сами данные, так что следующее, хоть и выглядит заманчиво, но будет неверным:

# воплощенное зло (или, по крайней мере, просто неверно)

$e->{cn} = 'Jay Sekora;

В качестве альтернативы можно действовать наверняка и применять метод объекта для добавления данных:



$e->addValue('en', 'Jay Sekora1);

Для добавления нескольких значений атрибуту нужно повторно вызывать метод addValue():

$e->addValue( 'title', 'Unix SysAdmin');

$e->addValue('title' 'Part-time Lecturer'):

Мне больше по душе второй подход, т. к. при его использовании менее вероятно, что программа перестанет работать, если в следующих версиях модуля изменится способ представления данных.

После того как элемент заполнен, можно вызвать метод ado() для внесения его в каталог. Вот маленький сценарий, который добавляет элемент в каталог. В качестве аргументов командной строки он принимает имя сервера, идентификатор пользователя (будет использоваться как часть отличительного имени) и общее имя:

use Mozilla::LDAP::Conn;

Sserver = $ARGV[0];

Sport = getservbyrianieC'ldap". "tcp") ii "389"

Ssuffix = "ou=People, ou=Systems, dc=ccs, dc=hogwarrs. ac=edu":

Srootdn = "cn=Manager, ou=Systems. dc=ccs. oc=hogwarrs, dc=edu":

$pw = "secret";

ft неанонимное соединение

$c = new Mozilla::LDAP::Conn($server,Sport,Srootdn,$pw):

die "Невозможно соединиться с $server\n" unless $c:

$e = new Mozilla::LDAP::Entry;

ft DN-имя - это идентификатор пользователя плюс суффикс,

ft определяющий, куда поместить его в дереве каталогов

$e->setDN("uid=$ARGV[1],Ssuffix");

$e->addValue('uid', $ARGV[1]);

$e->addValue('cn', $ARGV[2]);

$c->add($e);

die "Ошибка при добавлении: ". $c->getErrorString(),"\n" if $c-

>getErrorCode();

Обратите внимание, что в программе не выполняется проверка ошибок при вводе. Если вы пишете сценарий, который действительно может использоваться в интерактивном режиме, необходимо проверять вводимые данные, чтобы убедиться, что в них нет неэкранированных специальных символов, подобных запятым. Обратитесь к ранее приведенному «совету с совой» за разъяснениями о том, как заключать в кавычки значения атрибутов.

Теперь перейдем к Net: :LDAP. При желании процесс добавления элементов для Net: : LDAP может быть менее объектно-ориентированным. В него входят модуль Entry (Net:: LDAP: : Entry) и конструктор для экземпляра объекта элемента. Однако он содержит еще одну функцию add(), которая способна принимать структуру данных для добавления элемента за один шаг:

$res = $c->add(

dn => 'uid=jay, ou=systems, ou=people. dc=ccs, dc=hogwarts, dc=edi/ attr =>

[ 'en' => 'Jay Sekora', ' sn => 'Sekora', 'mail' => 'jayguy@ccs.hogwarts.edj', 'title' = -

[ 'Sysadmin'.' Part-time Lect-jrer' ]. 'uid' => 'jayguy' ]

На этот раз add() передается два аргумента. Первый - это DN-имя для элемента; второй - ссылка на анонимный массив пар атрибут-значение. Обратите внимание, что атрибуты с несколькими значениями, например title, определяются при помощи вложенного анонимного массива. Тем, кто привык работать со структурами данных в Perl и кому не нравится объектно-ориентированный стиль программирования, такой подход придется больше по душе.



Содержание раздела