Установка соединения LDAP с Java

Я пытаюсь установить соединение LDAP на Java, используя функцию, которая возвращает LdapContext и принимает параметры для имени пользователя, пароля, имени домена и сервера. Непонятно, как должны выглядеть эти параметры.

Я пытаюсь подключиться к этому тестовому серверу LDAP только для чтения. http://www.forumsys.com/tutorials/integration-how-to/ldap/online-ldap-test-server/

И метод getConnection, который я использую, является производным от класса Active Directory, который я нашел здесь. http://www.javaxt.com/wiki/Tutorials/Windows/How_to_Authenticate_Users_with_Active_Directory

Сейчас я пытаюсь получитьConnection("tesla", "password", "cn=read-only-admin,dc=example,dc=com", "ldap.forumsys.com:389"), и это не работает. Я пробовал переключаться между доменом и сервером, а также пробовал "только для чтения-admin.example.com" вместо "cn=...".

функция getConnection

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){}
        }

        //System.out.println("Authenticating " + username + "@" + domainName + " through " + serverName);

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

        //bind by using the specified username/password
        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) + '/';
        props.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
        props.put(Context.PROVIDER_URL, ldapURL);
        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));
        }
    }

моя попытка подключиться

try{
                LdapContext ctx =  ActiveDirectory.getConnection("tesla", "password", "cn=read-only-admin,dc=example,dc=com", "ldap.forumsys.com:389");
                ctx.close();
            }
            catch(Exception e){
                //Failed to authenticate user!
            }

Он перехватывает исключение "javax.naming.CommunicationException".

Трассировка стека, пожалуйста.

user207421 11.07.2019 00:32
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
1 898
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема в том, что вы пытаетесь использовать нестандартное имя пользователя для аутентификации (которое работает с AD, но не с OpenLDAP).

String principalName = username + "@" + domainName;
props.put(Context.SECURITY_PRINCIPAL, principalName);

В OpenLDAP, как показано в руководстве, имя принципала должно быть uid=tesla,dc=example,dc=com

Просто чтобы уточнить, мои параметры будут такими: случае, то имя принципала становится "uid=tesla@dc=example,dc=com", а не "uid=tesla,dc=example,dc=com", как вы говорите.

Slenderbowman 11.07.2019 15:54

Ничего себе, я понимаю. Было бы лучше изменить функцию так, чтобы имя принципала стало uid=tesla,dc=example,dc=com. Что-то вроде String имя_пользователя = имя_пользователя + "," + имя_домена;

Slenderbowman 11.07.2019 19:06

Другие вопросы по теме