Подключение сервера LDAP из Java-приложения - PullRequest
7 голосов
/ 21 мая 2010

Я создаю приложение на основе GXT (J2EE). Теперь проблема в том, что я должен подключить приложение к серверу LDAP. Можете ли вы рассказать мне, как подключить сервер LDAP из нашего Java-приложения и какую библиотеку или API я должен использовать для этого?

Ответы [ 3 ]

9 голосов
/ 21 мая 2010

Для подключения к LDAP проверьте следующие пакеты / классы:

javax.naming.directory.*
javax.naming.ladp.*
com.sun.jndi.ldap.LdapCtxFactory
com.sun.jndi.ldap.ControlFactory

Пример кода:

//build a hashtable containing all the necessary configuration parameters
Hashtable<String, String> environment = new Hashtable<String, String>();

environment.put(LdapContext.CONTROL_FACTORIES, conf.getProperty("ldap.factories.control"));
environment.put(Context.INITIAL_CONTEXT_FACTORY, conf.getProperty("ldap.factories.initctx"));
environment.put(Context.PROVIDER_URL, conf.getProperty("ldap.host"));
environment.put(Context.SECURITY_AUTHENTICATION, "simple");
environment.put(Context.SECURITY_PRINCIPAL, conf.getProperty("ldap.user"));
environment.put(Context.SECURITY_CREDENTIALS, conf.getProperty("ldap.password"));
environment.put(Context.STATE_FACTORIES, "PersonStateFactory");
environment.put(Context.OBJECT_FACTORIES, "PersonObjectFactory");

// connect to LDAP
DirContext ctx = new InitialDirContext(environment);

// Specify the search filter
String FILTER = "(&(objectClass=Person) ((sAMAccountName=" + user.getUsername() + ")))";

// limit returned attributes to those we care about
String[] attrIDs = { "sn", "givenName" };

SearchControls ctls = new SearchControls();
ctls.setReturningAttributes(attrIDs);
ctls.setSearchScope(SearchControls.SUBTREE_SCOPE);

// Search for objects using filter and controls
NamingEnumeration answer = ctx.search(searchBase, FILTER, ctls);

...

SearchResult sr = (SearchResult) answer.next();
Attributes attrs = sr.getAttributes();
surName = attrs.get("sn").toString();
givenName = attrs.get("givenName").toString();
...

В этом примере у меня есть объект конфигурации, который считывает эти значения из файла конфигурации.

Значения будут:

# LDAP parameters
ldap.host = ldap://ldap.mydomain.com:389
ldap.factories.initctx = com.sun.jndi.ldap.LdapCtxFactory
ldap.factories.control = com.sun.jndi.ldap.ControlFactory
ldap.searchbase = dc=mydomain,dc=us
ldap.user = MYDOMAIN.COM\\ldap-user
ldap.userBase= MYDOMAIN.COM\\
ldap.password = ******
3 голосов
/ 05 июня 2017
  • Подключение к серверу LDAP осуществляется с использованием JNDI (Java Naming and Интерфейс каталога) API в Java.
  • Интерфейсы, классы и исключения JNDI доступны в Следующие пакеты поставляются с JDK:

    • javax.naming. *
    • javax.naming.directory. *
  • Это означает, что нам не нужно использовать какие-либо внешние библиотеки для работы с серверами LDAP, в большинстве случаев.

  • Указывает, что URL сервера LDAP состоит из имени хоста, на котором Сервер LDAP работает под номером порта. Хорошо известный номер порта Облегченный протокол доступа к каталогам по умолчанию - 389.

  • Также необходимо указать некоторые свойства среды для соединения и аутентификация в объекте Hashtable.

Вот пример кода:

import javax.naming.*;
import javax.naming.ldap.*;
import javax.naming.directory.*;

public class Ldap
{
    public static void main(String[]args)
    {
        Hashtable<String, String> environment = new Hashtable<String, String>();

        environment.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
        environment.put(Context.PROVIDER_URL, "ldap://<hostname>:389");
        environment.put(Context.SECURITY_AUTHENTICATION, "simple");
        environment.put(Context.SECURITY_PRINCIPAL, "<Login DN>");
        environment.put(Context.SECURITY_CREDENTIALS, "<password>");

        try 
        {
            DirContext context = new InitialDirContext(environment);
            System.out.println("Connected..");
            System.out.println(context.getEnvironment());
            context.close();
        } 
        catch (AuthenticationNotSupportedException exception) 
        {
            System.out.println("The authentication is not supported by the server");
        }

        catch (AuthenticationException exception)
        {
            System.out.println("Incorrect password or username");
        }

        catch (NamingException exception)
        {
            System.out.println("Error when trying to create the context");
        }
    }
}
0 голосов
/ 18 мая 2012

Вы даже можете использовать Netscape LDAP SDK , который в данный момент не активен, но дает больший контроль в программировании LDAP

...