Динамические списки внутри не "списочных" объектов

LDAP
Положим, у вас уже есть объект с описанием отдела фирмы, содержащим массу полезных атрибутов, включая фотографию начальника в костюме деда мороза и ряженных в зайчиков подчинённых с последнего корпоратива. И вот возникла задача собрать ещё и список сотрудников внутри объекта отдела и формировать его, разумеется, не вручную, а, как и положено в лучших домах Лондона и Парижа, динамически.

Задача, казалось бы, не трудная, но… вам нужны два дополнительных атрибута: тот, который будет содержать LDAP URI с параметрами поиска (где начинать, на какую глубину искать, по каким критериям отбирать, какие атрибуты находить), да и собственно многозначный атрибут, содержащий имена (или что угодно ещё) сотрудников отдела. В чём нетривиальность задачи? В том, что общеизвестные классы объектов, представляющих «группы чего-либо» как назло объявлены STRUCTURAL. А это значит, что если у вас уже есть объект в каталоге со своим структурным объектным классом (или стэком оных), то вы физически не сможете добавить ему ещё один. И ещё. например, тот же groupOfNames заставляет в обязательном порядке искуственно добавлять одного фиктивного member'а, потому что таковой атрубут объявлен как MUST. Впрочем, при внимательном рассмотрении выясняется, что всё-таки есть один objectClass, который спроектирован разумно, без указанных недостатков: он AUXILIARY, а member'ы, перечисляемые в данном случае в атрибуте memberURL, опциональны (MAY, а не MUST). И этот objectClass зовётся groupOfURLs, всячески вам его рекомендую.
Остаётся последний вопрос: где взять атрибут для LDAP URI? О, ну это совсем просто! Конечно, вы можете и добавить сбоку припёку дополнительный класс labeledURIObject, вся цель существования которого как раз и сводится к тому, чтобы предоставить вам labeledURI… Но зачем же так всё усложнять? Посмотрите повнимательнее на inetOrgPerson, который, кстати и не к ночи будет сказано, отличается очень внушительным и едва ли не исчерпывающим набором атрибутов общего назначения. Видите теперь кое-что необычное? Да-да-да, в нём тоже есть labeledURI!
Итак, поехали:
1) Модифицируем cn=config
dn: cn=module{0},cn=config
changeType: modify
add: olcModuleLoad
olcModuleLoad: dynlist.la

dn: olcOverlay=dynlist,olcDatabase={x}hdb,cn=config
objectClass: olcOverlayConfig
objectClass: olcDynamicList
olcOverlay: dynlist
olcDlAttrSet: groupOfURLs labeledURI memberURL
2) Добавляем всё нужное нашему inetOrgPerson'у, представляющему в данном случае подразделение компании:

dn: ou=IT,o=Company,l=SomeCity,c=SomeCountry
add: objectClass
objectClass: groupOfURLs
-
add: labeledURI
labeledURI: ldap:///ou=Staff,o=Company,l=SomeCity,c=SomeCountry??sub?(&(objectClass=posixAccount)(ou=IT))


Вуаля, при просмотре объекта ou=IT вы получите динамически формируемый перечень DN'ов всех сотрудников соотв отдела SomeCompany.

1 комментарий

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.