Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Все запросы к LDAP завершаются exception / 5 сообщений из 5, страница 1 из 1
23.01.2014, 10:57
    #38535296
olexande
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Все запросы к LDAP завершаются exception
Заранее спасибо!

Для учебного построения своего велосипеда, есть необходимость делать запросы к LDAP. В реальности стоит MS AD LDAP реализация от 2008 сервера. На ней и тренируюсь.

Запросы делать получилось. Ответы верны :)

Загвоздка в том, что в отличие от SQL-запросов, все запросы завершаются ошибкой (exception).
Для некоторых ошибок помогло с помощью гугла добавление таймаута. Но теперь "лезут" другие...

Может я нашел "неудачный пример"? Или это "нормально"?

Источник, код и последняя ошибка ниже:

источник примера

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
    import javax.naming.Context;
    import javax.naming.NamingEnumeration;
    import javax.naming.directory.*;
    import java.util.Hashtable;
     
    /**
     * User: gmc
     * Date: 16/02/11
     * http://code.google.com/p/java-use-examples/source/browse/trunk/src/com/aw/ad/LdapBasicExample.java?r=2
     */
    public class LdapBasicExample {
     
        public static void main(String[] args) {
            String userName = "ldaplogin";         // Логин входа в АД
            Hashtable env = new Hashtable();
            env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
            env.put(Context.PROVIDER_URL, "ldap://192.168.1.1:389/dc=firma,dc=ua");     // Адрес сервера
            env.put(Context.SECURITY_AUTHENTICATION, "simple");
            env.put(Context.SECURITY_PRINCIPAL, new String("firma" + "\\" + userName));
            env.put(Context.SECURITY_CREDENTIALS, "ldappass");    // Пароль
            env.put(Context.REFERRAL, "follow");
            env.put("com.sun.jndi.ldap.read.timeout", "500");       // Настройка таймаута. Пробовал разные значения. Но мне не помогает :(
     
            DirContext ctx = null;
            NamingEnumeration results = null;
            try {
                ctx = new InitialDirContext(env);
                SearchControls controls = new SearchControls();
                controls.setSearchScope(SearchControls.SUBTREE_SCOPE);
                controls.getCountLimit();
     
    //            String usersName = "ldapaccess";
    //            String filter = "(userid="+usersName+")";
    //            String filter = "(objectclass=person)&(userid=" + usersName + ")";
    //            String filter = "(objectclass=person)";
     
                String filter = "(mail=*)";              // Фильтр поиска
     
                String base="";
     
                results = ctx.search(base, filter, controls);
                while (results.hasMore()) {
                    SearchResult searchResult = (SearchResult) results.next();
                    Attributes attributes = searchResult.getAttributes();
                    Attribute attr = attributes.get("cn");
                    String cn = (String) attr.get();
                    System.out.println(" Person Common Name = " + attributes.get("cn"));
    //                System.out.println(" Person Display Name = " + attributes.get("displayName"));
                    System.out.println(" Person e-mail = " + attributes.get("mail"));
                    //System.out.println(" Person logonhours = " + attributes.get("logonhours"));
    //                System.out.println(" Person MemberOf = " + attributes.get("memberOf"));
                }
            } catch (Throwable e) {
                e.printStackTrace();
            } finally {
                if (results != null) {
                    try {
                        results.close();
                    } catch (Exception e) {
                    }
                }
                if (ctx != null) {
                    try {
                        ctx.close();
                    } catch (Exception e) {
                    }
                }
            }
        }
    }



javax.naming.PartialResultException [Root exception is javax.naming.CommunicationException: firma.UA:389 [Root exception is java.net.ConnectException: Connection timed out: connect]]
at com.sun.jndi.ldap.LdapNamingEnumeration.hasMoreImpl(LdapNamingEnumeration.java:242)
at com.sun.jndi.ldap.LdapNamingEnumeration.hasMoreReferrals(LdapNamingEnumeration.java:380)
at com.sun.jndi.ldap.LdapNamingEnumeration.hasMoreImpl(LdapNamingEnumeration.java:226)
at com.sun.jndi.ldap.LdapNamingEnumeration.hasMoreReferrals(LdapNamingEnumeration.java:380)
at com.sun.jndi.ldap.LdapNamingEnumeration.hasMoreImpl(LdapNamingEnumeration.java:226)
at com.sun.jndi.ldap.LdapNamingEnumeration.hasMore(LdapNamingEnumeration.java:189)
at LdapBasicExample.main(LdapBasicExample.java:41)
Caused by: javax.naming.CommunicationException: firma.UA:389 [Root exception is java.net.ConnectException: Connection timed out: connect]
at com.sun.jndi.ldap.LdapReferralContext.<init>(LdapReferralContext.java:92)
at com.sun.jndi.ldap.LdapReferralException.getReferralContext(LdapReferralException.java:150)
at com.sun.jndi.ldap.LdapNamingEnumeration.hasMoreReferrals(LdapNamingEnumeration.java:357)
at com.sun.jndi.ldap.LdapNamingEnumeration.hasMoreImpl(LdapNamingEnumeration.java:226)
... 6 more
Caused by: java.net.ConnectException: Connection timed out: connect
at java.net.TwoStacksPlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:157)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:391)
at java.net.Socket.connect(Socket.java:579)
at java.net.Socket.connect(Socket.java:528)
at java.net.Socket.<init>(Socket.java:425)
at java.net.Socket.<init>(Socket.java:208)
at com.sun.jndi.ldap.Connection.createSocket(Connection.java:366)
at com.sun.jndi.ldap.Connection.<init>(Connection.java:201)
at com.sun.jndi.ldap.LdapClient.<init>(LdapClient.java:136)
at com.sun.jndi.ldap.LdapClient.getInstance(LdapClient.java:1600)
at com.sun.jndi.ldap.LdapCtx.connect(LdapCtx.java:2698)
at com.sun.jndi.ldap.LdapCtx.<init>(LdapCtx.java:316)
at com.sun.jndi.ldap.LdapCtxFactory.getUsingURL(LdapCtxFactory.java:193)
at com.sun.jndi.ldap.LdapCtxFactory.getLdapCtxInstance(LdapCtxFactory.java:152)
at com.sun.jndi.url.ldap.ldapURLContextFactory.getObjectInstance(ldapURLContextFactory.java:52)
at javax.naming.spi.NamingManager.getURLObject(NamingManager.java:601)
at javax.naming.spi.NamingManager.processURL(NamingManager.java:381)
at javax.naming.spi.NamingManager.processURLAddrs(NamingManager.java:361)
at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:333)
at com.sun.jndi.ldap.LdapReferralContext.<init>(LdapReferralContext.java:111)
... 9 more
СБОРКА УСПЕШНО ЗАВЕРШЕНА (общее время: 21 секунды)
...
Рейтинг: 0 / 0
23.01.2014, 12:10
    #38535397
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Все запросы к LDAP завершаются exception
Вероятно некоторые запросы действительно долго выполняются. 500ms это совсем мало для удаленных запросов. Поставьте несколько секунд. Возьмите любую готовую тулзу для LDAP и посмотрите в ней сколько ваши запросы выполняются.
...
Рейтинг: 0 / 0
23.01.2014, 13:53
    #38535554
Андрей Панфилов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Все запросы к LDAP завершаются exception
olexandeЗаранее спасибо!
env.put(Context.PROVIDER_URL, "ldap://192.168.1.1:389/dc=firma,dc=ua"); // Адрес сервера
...
env.put(Context.REFERRAL, "follow");
....
Caused by: java.net.ConnectException: Connection timed out: connect
....
at com.sun.jndi.ldap.LdapReferralContext.<init>(LdapReferralContext.java:111

есть мнение, что в условия Вашего поиска попадают рефералы, которые находятся на других узлах AD, а к этим узлам у вас доступа нет, варианта борьбы два: подключаться к глобальному каталогу (нужно установить у какого сервера есть такая роль и соответственно подключаться по порту 3268, в приницпе можно огрести проблем из-за того, что в глобальный каталог попадают не все атрибуты), использовать Context.REFERRAL, "ignore"
...
Рейтинг: 0 / 0
23.01.2014, 23:08
    #38536152
olexande
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Все запросы к LDAP завершаются exception
Blazkowicz500ms
Пробовал и секунду. не помогало.
Пробовал и заведомо "короткий запрос" - получаю ответ. программа ждет. получаю эксепшн.
Пробовал и на "объемном запросе" ставить разное время - ексепшн всегда появлялся. При очень коротком времени сессии, получал только часть данных. При более длинных - больше информации.

Попробовать сделать короткий запрос с разным временем и скинуть логи? Наверно, таки попробую. Может, что интересное покажет.

BlazkowiczВозьмите любую готовую тулзу для LDAP и посмотрите в ней сколько ваши запросы выполняются. Можете что-то "по проще" порекомендовать. "Что-то" нашел, но с запросами напрямую разобрался быстрее, чем с той тулзой ...

Андрей Панфиловиспользовать Context.REFERRAL, "ignore" - спасибо, попробую и отпишусь.
...
Рейтинг: 0 / 0
10.02.2014, 22:43
    #38556372
olexande
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Все запросы к LDAP завершаются exception
Был слегка занят некоторое время другими задачами.

Попробовал:
Андрей Панфиловиспользовать Context.REFERRAL, "ignore" - спасибо, попробую и отпишусь.[/quot]
ИМХО стало хуже. Появились "промежуточные" исключения.

Так же получил неожиданные для себя результаты:

Работает:
Код: java
1.
String filter = "(mail=*)";              // Фильтр поиска



Выдает ексепшн:
Код: java
1.
String filter = "(mail = *)";              // Фильтр поиска


javax.naming.directory.InvalidSearchFilterException: invalid attribute description; remaining name ''
at com.sun.jndi.ldap.Filter.encodeSimpleFilter(Filter.java:437)
at com.sun.jndi.ldap.Filter.encodeFilter(Filter.java:146)
at com.sun.jndi.ldap.Filter.encodeFilterString(Filter.java:74)
at com.sun.jndi.ldap.LdapClient.search(LdapClient.java:539)
at com.sun.jndi.ldap.LdapCtx.doSearch(LdapCtx.java:1985)
at com.sun.jndi.ldap.LdapCtx.searchAux(LdapCtx.java:1847)
at com.sun.jndi.ldap.LdapCtx.c_search(LdapCtx.java:1772)
at com.sun.jndi.toolkit.ctx.ComponentDirContext.p_search(ComponentDirContext.java:386)
at com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.search(PartialCompositeDirContext.java:356)
at com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.search(PartialCompositeDirContext.java:339)
at javax.naming.directory.InitialDirContext.search(InitialDirContext.java:267)
at LdapBasicExample.main(LdapBasicExample.java:42)
СБОРКА УСПЕШНО ЗАВЕРШЕНА (общее время: 6 секунды)


А отличаются-то они всего-навсего пробелами вокруг знака "=" в теле фильтра.

Относительно много нервов и времени потерял, пытаясь найти причину.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Все запросы к LDAP завершаются exception / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]