Nano Hash - криптовалюты, майнинг, программирование

Простая аутентификация пользователя LDAP (JNDI - Tomcat) не стабильна?

Я новичок в аутентификации Java LDAP с использованием JNDI. При поиске в Интернете учебных пособий я нашел пример кода по следующему URL-адресу,

http://www.javaxt.com/Tutorials/Windows/How_to_Authenticate_Users_with_Active_Directory

Я создаю веб-приложение, используя JavaServlet и JSP.

Просто я хочу аутентифицировать пользователей с помощью LDAP.

Мой сервер Apache, Tomcat, и я использую для этого Xampp.

Теперь система хорошо аутентифицирует пользователей с помощью LDAP, но иногда выдает ошибочное исключение.

«javax.naming.NamingException: не удалось подключиться к xxxxxx.com»

Осталось около часа, автоматически система снова заработает.

может ли кто-нибудь сказать мне, в чем будет проблема?

Я сменил сервер на GlassFish, но проблема та же.

Вот мой код,

 public static LdapContext getConnection (String username, String password,
            String domainName, String serverName) throws NamingException {

        if (domainName == null) {
            try {
                String fqdn = java.net.InetAddress.getLocalHost()
                        .getCanonicalHostName();
                if (fqdn.split("\\.").length > 1) {
                    domainName = fqdn.substring(fqdn.indexOf(".") + 1);
                }
            } catch (java.net.UnknownHostException e) {
            }
        }

        if (password != null) {
            password = password.trim();
            if (password.length() == 0) {
                password = null;
            }
        }

        Hashtable props = new Hashtable();

        String principalName = username + "@" + domainName;

        props.put(Context.SECURITY_PRINCIPAL, principalName);

        if (password != null) {
            props.put(Context.SECURITY_CREDENTIALS, password);
        }        

        String ldapURL = "ldap://"
                + ((serverName == null) ? domainName : serverName + "."
                        + domainName) +":389/";             

        String Auth_Metho="simple";      

        props.put(Context.SECURITY_AUTHENTICATION,
                Auth_Metho); 
        props.put(Context.INITIAL_CONTEXT_FACTORY,
                "com.sun.jndi.ldap.LdapCtxFactory");
        props.put(Context.PROVIDER_URL, ldapURL);
        props.put("com.sun.jndi.ldap.read.timeout", "0");
        try {           
            return new InitialLdapContext(props, null);
        } catch (javax.naming.CommunicationException e) {
            throw new NamingException("Failed to connect to " + domainName
                    + ((serverName == null) ? "" : " through " + serverName));
        } catch (NamingException e) {
            throw new NamingException("Failed to authenticate " + username
                    + "@" + domainName
                    + ((serverName == null) ? "" : " through " + serverName));
        }
    }

//Then call it as....

String SreverName = "xxxxxx.com";
String userName = "xxxxx";
String password ="xxxxx";

 LdapContext ctx;
        try {
            ctx = ActiveDirectory.getConnection( userName ,
                    password , SreverName);
             ctx.close(); // unameStr, passStr,
             System.out.println("Authenticated!");
        } catch (NamingException e) {
            // TODO Auto-generated catch block

            e.printStackTrace();
        }

Ответы:


1

Во-первых, код, который вы используете, подавляет настоящее исключение. Что за CommunicationException происходит? Учитывая этот код, нет никакого способа узнать.

} catch (javax.naming.CommunicationException e) {
    throw new NamingException("Failed to connect to " + domainName + ((serverName == null) ? "" : " through " + serverName));

Шаг 1 — исправить это, чтобы у вас было хотя бы больше информации о том, в чем заключается настоящая проблема.

Однако даже без этой дополнительной информации наиболее вероятная проблема заключается в том, что LDAP отключается, чтобы можно было выполнить резервное копирование или реорганизацию. Большинство компаний используют несколько LDAP и отключают их по одному, чтобы можно было выполнять их техническое обслуживание каждую ночь или неделю. Один из способов справиться с этим — указать несколько URL-адресов LDAP для PROVIDER_URL. Поставщик LDAP будет пытаться использовать каждый URL-адрес до тех пор, пока соединение не будет успешно создано.

props.put(Context.PROVIDER_URL, "ldap://ldap1.domain.com:389 " +
    "ldap://ldap2.domain.com:389 " +
    "ldap://ldap3.domain.com:389");

Возможно, вам придется обратиться к администратору LDAP, чтобы получить URL-адреса для каждого отдельного LDAP. И пока вы этим занимаетесь, спросите своего администратора, когда он отключит LDAP для обслуживания, и сопоставьте это с ошибками подключения, которые вы видите.

В качестве альтернативы, если у вашей компании нет записи DNS для каждого отдельного LDAP, а имя хоста, которое вы сейчас используете, имеет несколько связанных с ним IP-адресов, вы можете использовать InetAddress, чтобы получить все IP-адреса и построить PROVIDER_URL из них.

InetAddress[] addresses = InetAddress.getAllByName(ldapHostname);
String providerUrl = "ldap://" + addresses[0].getHostAddress() + ":389";
for(int i = 1; i < addresses.length; i++){
    providerUrl += " ldap://" + addresses[i].getHostAddress() + ":389";
}
props.put(Context.PROVIDER_URL, providerUrl);
12.08.2014
  • Сион, я очень ценю ответ и рекомендации, которые вы дали здесь. Да, я понял, что `CommunicationException` подавляет настоящее исключение. Я связался с администратором LDAP, они не поддерживают несколько LDAP. А также у них есть DNS для данного LDAP. Я отследил точное исключение, вот оно, javax.naming.CommunicationException: xxxxxx.com:389 [Root exception is java.net.ConnectException: Connection timed out: connect] at com.sun.jndi.ldap.Connection.<init>(Unknown Source) ... more ... И я сериализовал Hashtable, но проблема та же. 13.08.2014
  • И я установил тайм-аут как props.put("com.sun.jndi.ldap.read.timeout", "0");, но ничего не изменилось. 13.08.2014
  • com.sun.jndi.ldap.read.timeout применяется только для чтения данных из LDAP. Я считаю, что настройка, которую вы хотите, будет com.sun.jndi.ldap.connect.timeout. Я не верю, что установка времени ожидания соединения на 0 будет иметь значение (но я полагаю, что стоит попробовать). Вы спрашивали своего администратора LDAP, отключают ли они сервер для запланированного резервного копирования? Я по-прежнему считаю, что это наиболее вероятное объяснение: любой порядочный администратор LDAP будет регулярно выполнять резервное копирование и реорганизацию. 13.08.2014
  • Я получил ваше объяснение настройки тайм-аута, администратор LDAP не говорит ничего такого, как запланировано так часто. И что сбивает с толку, так это то, что некоторые системы нормально работают с LDAP в той же сети, но они реализованы на php. 13.08.2014
  • Проблема определенно не связана с конкретной проблемой Java, многие люди используют этот API без каких-либо проблем (включая меня). Единственное, что я могу посоветовать, это работать с вашими администраторами LDAP и сетевыми администраторами, чтобы попытаться отладить проблему, пока она возникает (попробуйте подключиться к LDAP с вашего сервера во время простоя, попросите ваших сетевых администраторов проверить, не подключены ли ваш сервер достигает LDAP во время сбоя и т. д.) 13.08.2014
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..