Здравствуйте. Подскажите пожалуйста как можно получать группу из ou=* и уже после этого делать второй запрос для получения названия группы.
Так выглядит ldiff пользователя
ldapsearch -x -b 'dc=сompany,dc=my' '(&(objectClass=person)(uid=test5))'
dn: uid=test5,ou=people,ou=operators,dc=company,dc=my
sn: Testov5
givenName: Test5
uid: test5
homePhone: 3143
preferredLanguage: ru_RU
cn: Test5 Testov5
homeDirectory: /home/test5
loginShell: /bin/bash
uidNumber: 1097
gidNumber: 1001
gecos: Test5 Testov5
shadowLastChange: 14949
mail:
telephoneNumber: 3143
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: gosaAccount
objectClass: posixAccount
objectClass: shadowAccount
objectClass: gosaMailAccount
objectClass: gosaProxyAccount
objectClass: goFonAccountldiff группы operators '(&(objectClass=gosaDepartment)(ou=operators))'
dn: ou=operators,dc=company,dc=my
ou: operators
objectClass: organizationalUnit
objectClass: top
objectClass: gosaDepartment
description:: 0JrQu9C40LXQvdGC0YHQutCw0Y8g0YHQu9GD0LbQsdCwLiDQntC/0LXRgNCw0YLQvtGA0Ys=Используя фильтр ниже, есть недостаток он выводит линуксовые группы которые не нужно показывать и название группы берётся не из выше привидённого варианта ldiff для групп.
{mod_shared_roster_ldap, [
{ldap_base, "dc=company,dc=my"},
{ldap_rfilter, "(objectClass=posixGroup)"},
{ldap_gfilter, "(&(objectClass=posixGroup)(cn=*)(!(objectClass=gosaMailAccount)))"},
{ldap_filter, ""},
{ldap_ufilter, "(&(objectClass=person)(uid=%u))"},
{ldap_memberattr, "memberUid"},
{ldap_groupattr, "cn"},
{ldap_groupdesc, "cn"},
{ldap_userdesc, "cn"}Если нужно могу выложить часть лога c запросом в ldap из ejabberd.
Версия ejabberd 2.1.10-3 i386 (wheezy/sid)
В родной версиеи модуля
В родной версиеи модуля невозможно использовать ou в качестве группы. Есть модификация, в которой это исправлено:
Делаю для получения
Делаю для получения пользователей {ldap_rfilter, "(&(objectClass=posixAccount)(!(loginShell=/bin/false)))"},
вывод у неё такой же как в примере выше пользователя test5.
Не совсем понимаю как мне из записи uid=test5,ou=people,ou=operators,dc=company,dc=my выбрать вторую ou=* в той версии модуля которую вы порекомендовали. После этого взять и произвести поиск в '(&(objectClass=gosaDepartment)(ou=%g))' для получения нормального имени.
Вы просто неправильно видите
Вы просто неправильно видите задачу. Кстати, на странице EJAB-1480 есть примеры и обсуждения специально для случая получения списка из ou.
Обращаю внимание, что этот конфиг работает только с модифицированной версией модуля!
{mod_shared_roster_ldap, [{ldap_base, "dc=company,dc=my"},
%Сначала получите список групп. Кто Вам сказал, что это надо делать через пользователей?
{ldap_rfilter, "(objectClass=organizationalUnit)"},
%Теперь определите, где в полученных объектах хранятся идентификаторы групп
{ldap_groupattr, "ou"},
%Теперь, когда готов список идентификаторов всех групп, опросим каждую группу по отдельности, как на будет называться
{ldap_gfilter, "(&(objectClass=organizationalUnit)(ou=%g))"},
%Атрибут, содержащий имя группы
{ldap_groupdesc, "description"},
%Пользователями группы будут её подобъекты в иерархии LDAP
{ldap_member_selection_mode, group_children},
%Для каждой группы модуль будет искать все подобъекты в качестве пользователей, но мы можем ограничить этот поиск (в данном случае не должно быть "%u")
{ldap_ufilter, "(objectClass=person)"},
%Теперь определим, где у объектов-пользователей хранится пользовательская часть jid
{ldap_useruid, "uid"},
%Где у пользователя хранится отображаемое имя
{ldap_userdesc, "cn"}
%Как бы всё :)
]}
Если Вы не хотите, чтобы какие-то конкретные ou попали в список групп, Вы можете либо уточнить ldap_base, либо внести эти конкретные ou в ldap_rfilter:
{ldap_rfilter, "(&(objectClass=organizationalUnit)(!(ou=operators)))"},Спасибо, работает только
Спасибо, работает только пришлось добавить одну группу в исключение почему то несколько пользователей дублировались и были вне группы. Может знаете возможно подписать сервис жаббера всем пользователям в ростере?
bng wrote: Может знаете
Может знаете возможно подписать сервис жаббера всем пользователям в ростере?
Не понял вопрос.
Решил тут обновиться до
Решил тут обновиться до версии 16.09. Бага EJAB-1480 закрыта. Хотелось бы узнать сейчас можно воспользоваться родным модулем mod_shared_roster_ldap или надо по прежнему использовать модифицированный модуль?
Сходу с родным не получилось.
В новом модуле фильтры
В новом модуле фильтры ldap_gfilter и ldap_ufilter объединяет в запросе к ldap(увидел запрос в логе ldap)
Старый модуль не получается собрать :(
Получил список
Получил список групп:
2017-12-22 14:07:15.322 [debug] <0.391.0>@eldap:recvd_packet:849 {searchResEntry,{'SearchResultEntry',<<"ou=groups,ou=operators,dc=company,dc=my">>,[{'PartialAttributeList_SEQOF',<<"ou">>,[<<"groups">>]}]}}Как я понимаю получаем список пользователей и название групп:
2017-12-22 14:07:15.611 [debug] <0.391.0>@eldap:send_command:789 {searchRequest,{'SearchRequest',<<"operators">>,baseObject,neverDerefAliases,0,5,false,{and,[{and,[{equalityMatch,{'AttributeValueAssertion',<<"objectClass">>,<<"organizationalUnit">>}},{equalityMatch,{'AttributeValueAssertion',<<"ou">>,<<"%g">>}}]},{and,[{equalityMatch,{'AttributeValueAssertion',<<"objectClass">>,<<"posixAccount">>}},{not,{equalityMatch,{'AttributeValueAssertion',<<"loginShell">>,<<"/bin/false">>}}}]}]},[<<"description">>]}}Не понимаю почему он склеивает в один запрос два фильтра
ldap_gfilter: "(&(objectClass=organizationalUnit)(ou=%g))" и ldap_ufilter: "(&(objectClass=posixAccount)(!(objectClass=gosaUserTemplate))(!(loginShell=/bin/false)))"Так как фильтр не правильный получают такой ответ
2017-12-22 14:07:15.614 [debug] <0.391.0>@eldap:recvd_packet:849 {searchResDone,{'LDAPResult',invalidDNSyntax,<<>>,<<"invalid DN">>,asn1_NOVALUE}}Модуль собрал от сюда