Поиск LDAP возвращает объект неожиданного типа

Я отправляю запрос LDAP к IBM Tivoli Directory Server (я запрашиваю специального пользователя "cn=monitor", но не знаю, имеет ли это значение).

Я выполняю следующий код: DirContext ctx = new InitialDirContext(env); Объект o = ctx.lookup("cn=monitor");

Я ожидал, что o будет иметь тип NamingEnumeration, но вместо этого он имеет тип DirContext. Я не могу понять, как получить возвращаемые данные из этого типа объекта.

Как ни странно, я вижу, что нужные мне данные извлекаются, потому что я включил отладку с помощью следующей команды: env.put("com.sun.jndi.ldap.trace.ber", System.out);


person Brian O'Donovan    schedule 07.04.2014    source источник


Ответы (3)


Я ожидал, что o будет иметь тип NamingEnumeration, но вместо этого он имеет тип DirContext.

Почему? NamingEnumerations возвращаются методом search(). Не lookup() методами. В документации ничего не говорит об обратном.

person user207421    schedule 07.04.2014
comment
Я пытался использовать search(), но у меня это не сработало. Если lookup() не возвращает NamingEnumerations, как я могу проанализировать данные, полученные с сервера? - person Brian O'Donovan; 07.04.2014
comment
Вам не нужно «анализировать данные». Это единственный объект, представляющий уникальную запись с этим именем. - person user207421; 08.04.2014

Я обнаружил, что должен использовать search() вместо lookup().

Я пробовал search() раньше, но он терпел неудачу из-за неправильной настройки области. Я исправил это, и теперь мой код работает,

person Brian O'Donovan    schedule 08.04.2014
comment
Вы должны использовать search(), если вы ожидаете несколько результатов, но не иначе. - person user207421; 08.04.2014

В случае, если будет полезно, пример кода:

Hashtable<String, String> env = new Hashtable<String, String>();
            env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
            env.put(Context.PROVIDER_URL, "ldap://XXX");
            env.put(Context.SECURITY_AUTHENTICATION, "simple");
            env.put(Context.SECURITY_PRINCIPAL, "DOMAIN\\user.name"); 
            env.put(Context.SECURITY_CREDENTIALS, "password");
            DirContext ctx = new InitialDirContext(env);
            if(ctx != null){
               String []requiredAttributes = {"sn","cn","sAMAccountName","memberOf"};
               SearchControls controls = new SearchControls();
               controls.setSearchScope(SearchControls.SUBTREE_SCOPE);
               controls.setReturningAttributes(requiredAttributes);
               SearchResult searchResult = null;
               NamingEnumeration user = ctx.search(USER_SEARCH_BASE, USER_SEARCH_FILTER, controls);
    while(users.hasMore()){
                searchResult=(SearchResult)users.next();
                Attributes attr = searchResult.getAttributes();
                String commonName = attr.get("cn").get(0).toString();
                System.out.println("Common Name: " + commonName);
               }

            }
person Yernar Arystanov    schedule 23.01.2019