Форум проекта Pro-LDAP.ru
Администрирование OpenLDAP => Конфигурационный файл slapd.conf => Тема начата: Ctannis от 14 Август 2015, 16:33:14
-
Добрый день.
Помогите решить некоторые вопросы.
Поднят OpenLdap прокси, с него хотелось получать некоторые поля и отфильтрованные данные.
Сам прокси запустить удалось, но остался вопрос фильтрации и отбор полей.
......
map attribute "displayname" "rusname"
.....
access to
attrs=entry,displayname,telephoneNumber
by anonymous read
by users read
by * none
Вопросы в следующем.
Как получить только вторую запись из displayname
И как получить только записи с заполненными telephoneNumber
В заранее благодарю за помощь.
-
Здравствуйте! Извините, что не сразу ответил.
Как получить только вторую запись из displayname
Вопрос сложный. Видимо, Вы имеете ввиду, что в атрибуте displayName два значения и Вам нужно получить второе из них. Дело в том, что значения атрибутов не упорядочиваются, поэтому говорить о том, какое из них первое, а какое второе проблематично =). Если у значений есть какие-то отличительные признаки, можно попытаться выбрать нужное путём конструирования хитрого ACL, да и то не факт, что получится. Опишите проблему поподробнее.
И как получить только записи с заполненными telephoneNumber
Тут попроще. В Вашем ACL надо добавить фильтр:
access to filter="(telephoneNumber=*)" attrs=entry,dispalyName,telephoneNumber
by anonymous read
by users read
by * none
Егор
-
Здравствуйте! Извините, что не сразу ответил.
Как получить только вторую запись из displayname
Вопрос сложный. Видимо, Вы имеете ввиду, что в атрибуте displayName два значения и Вам нужно получить второе из них. Дело в том, что значения атрибутов не упорядочиваются, поэтому говорить о том, какое из них первое, а какое второе проблематично =). Если у значений есть какие-то отличительные признаки, можно попытаться выбрать нужное путём конструирования хитрого ACL, да и то не факт, что получится. Опишите проблему поподробнее.
И как получить только записи с заполненными telephoneNumber
Тут попроще. В Вашем ACL надо добавить фильтр:
access to filter="(telephoneNumber=*)" attrs=entry,dispalyName,telephoneNumber
by anonymous read
by users read
by * none
Егор
Ничего страшного ответ не поздний, я в выходные предпочитаю отдыхать, что желаю и всем остальным.
Единственный отличительный признак это написание на русском языке.
По поводу фильтра я на самом деле такой уже пробовал, после его внесения в конфиг перестает вообще отображаться дерево.
-
Здравствуйте!
Единственный отличительный признак это написание на русском языке.
Тогда простого решения я не вижу =( . Можно вместо slapd-ldap написать какой-нибудь посредник на bash или perl, который будет выполнять запрос в исходный каталог и обработку возвращаемых результатов, и использовать slapd-shell или slapd-perl соответственно. Но это не так просто =) .
По поводу фильтра я на самом деле такой уже пробовал, после его внесения в конфиг перестает вообще отображаться дерево.
Видимо у Вас на том конце AD, он вообще капризно относится к любым ACL, кроме простейших. Я пробовал этот фильтр в прокси с OpenLDAP на OpenLDAP, всё нормально отрабатывает. Есть несколько вариантов дальнейших действий:
- Если Вы используете данные из прокси в качестве справочника в какой-нибудь программе, попробуйте указать фильтр при настройке запроса из этой программы.
- Если решитесь на написание посредника, то там можно предусмотреть отбор нужных записей.
- Наконец, можно сделать финт с двойным проксированием, то есть один раз получить "голые" данные в один OpenLDAP-прокси, а затем применить к ним фильтр с помощью второго OpenLDAP-прокси. Это можно сделать на одном и том же сервере.
Опять же, многое зависит от задачи, которую Вы решаете. Поэтому я обычно прошу описывать задачу подробнее.
Егор
-
На другом конце интереснее чем AD там находится Lotus Domino
Хорошо, я делаю добавление в поле
map attribute "displayname" "rusname"
а можно сделать замещение?
Когда делается добавление, оно становится вторым значением, там как из массива нельзя просто второй элемент взять?
-
Хорошо, я делаю добавление в поле
map attribute "displayname" "rusname"
а можно сделать замещение?
Когда делается добавление, оно становится вторым значением, там как из массива нельзя просто второй элемент взять?
Вы имеете ввиду, что добавляете в атрибут displayName второе значение, а можно ли вместо этого заменить уже имеющееся? Разумеется можно: добавление, удаление и замещение значений атрибутов -- стандартные для LDAP операции.
Что касается аналогии с массивом -- тут она неуместна. LDAP -- очень простой протокол, он возвращает значения тех атрибутов, которые Вы запрашиваете, причём все скопом, а Вы уж сами думайте, что с ними делать =) . Простота -- коронка и сильная сторона LDAP.
Кстати, пока писал, подумал про так называемые опции пометки атрибутов (http://pro-ldap.ru/tr/rfc/rfc4512.html#section-2.5.2.1) -- можно попробовать добавлять опцию lang-ru для пометки русскоязычного имени и затем использовать эту опцию как отличительный признак при поиске. Правда не знаю, дружит ли Lotus Domino с такими опциями.
Егор
-
Вы имеете ввиду, что добавляете в атрибут displayName второе значение, а можно ли вместо этого заменить уже имеющееся? Разумеется можно: добавление, удаление и замещение значений атрибутов -- стандартные для LDAP операции.
Я думаю мне как раз подойдет замещение, как это сделать?
-
Я думаю мне как раз подойдет замещение, как это сделать?
Вероятно, с помощью того же редактора, которым Вы добавляете новое значение в атрибут =) . Просто поменяйте уже имеющееся значение на новое.
Можно сделать средствами утилит командной строки OpenLDAP. Сначала создайте LDIF-файл примерно такого содержания:
dn: cn=pupkin,dc=mydomen,dc=ru
changetype: modify
replace: displayName
displayName: Вася Пупкин
И внесите изменение в каталог:
# ldapmodify -H ldap://192.168.1.1 -f /path/to/my-modify-file.ldif
В команде ldapmodify нужно ещё задать параметры подключения к каталогу, смотрите man-страницу (http://pro-ldap.ru/tr/man/ldapmodify.1.html).
Можно написать какой-нибудь несложный скрипт на bash, чтобы автоматизировать процесс модификации, или создать ldif-файл сразу для всех записей, которые необходимо модифицировать. Записи друг от друга отделяются пустой строкой.
Егор
-
Это через команды, а как через конфиг?
Сейчас я просто добавляю, а как так же но заменить?
map attribute "displayname" "rusname"
-
Это через команды, а как через конфиг?
Сейчас я просто добавляю, а как так же но заменить?
map attribute "displayname" "rusname"
Видимо, Вы думаете, что директива map что-то куда-то добавляет? На самом деле это не так. Она лишь преобразует полученный от удалённого сервера поток данных, в данном случае производит отображение удалённого имени атрибута rusname в локальное имя атрибута displayName. Кстати, до меня только что дошло, что удалённый атрибут именно rusname, спасибо man-странице slapo-rwm (http://www.openldap.org/software/man.cgi?query=slapo-rwm&sektion=5&apropos=0&manpath=OpenLDAP+2.4-Release). Ведь если удалённый атрибут нестандартный, отображайте его в какой-нибудь незадействованный локальный атрибут, а не в displayName, либо оставьте неотображенным, думаю, он не пропадёт из потока данных.
В любом случае, директивы конфигурации никоим образом не влияют на содержание каталога, с их помощью ничего в каталог не добавляется и не удаляется, только командами, либо через клиент (то есть скрытыми от глаз командами =) ).
Егор
-
Большое спасибо за мучения со мной, я получил некий опыт.
Мне оказалось проще написать выгрузку и загрузку требуемых данных в нужные мне поля.
Спасибо.