#java #ldap
#java #ldap
Вопрос:
Я пытаюсь прочитать всех участников, которые принадлежат к группе, определенной в LDAP как groupOfUniqueNames.
String url = "ldap://blah.blah.address:389/dc=foo,dc=bar";
Hashtable<String, String> env = new Hashtable<String, String>();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, url);
DirContext ctx = new InitialDirContext(env);
String[] attrIDs = {"uniqueMember"};
SearchControls cons = new SearchControls();
Attributes answer = ctx.getAttributes("cn=testgroup", attrIDs);
NamingEnumeration e = answer.getAll();
while (e.hasMore()) {
BasicAttribute attr = (BasicAttribute) e.next();
System.out.println(attr.getID() ": " attr.get());
}
Однако этот код выводит
uniqueMember:
как будто он не прочитал все значения уникального элемента.
Используя Apache Directory Studio, я вижу, что этот атрибут имеет 3 значения (одно из которых пустое). Как я могу получить доступ ко всем из них?
Если это имеет значение, я использую OpenLDAP.
Комментарии:
1. Похоже, LDAP вернул только пустое значение. Я не вижу ничего неправильного в вашем коде, если только не проглатывается исключение. Есть ли какой-либо контроль доступа у этого участника? Вы используете анонимное соединение с любыми минимальными привилегиями, определенными для этого в slapd.conf.
2. Нет, это определенно не проблема с авторизацией. Мне удалось решить эту проблему с помощью JLDAP.
3. Здравствуйте, у меня такая же проблема при попытке получить всех членов группы (члены — это многозначное поле в записи группы). Он вернет только первый элемент. Это ошибка в OpenLDAP? Java JNDI? Я бы хотел придерживаться JNDI и по возможности избегать JLDAP. Спасибо за любые обходные пути / идеи.
Ответ №1:
Мне удалось решить эту проблему с помощью JLDAP
LDAPConnection conn = new LDAPConnection();
conn.connect("blah.blah.address", 389);
String[] attrIDs = {"uniqueMember"};
LDAPSearchResults search = conn.search("dc=foo,dc=bar",
LDAPConnection.SCOPE_ONE,
"cn=testgroup", attrIDs, false);
while(search.hasMore()) {
LDAPEntry entry = search.next();
for (String string : entry.getAttribute("uniqueMember").getStringValueArray()) {
System.out.println(string);
}
}