Контекстный поиск LDAP в Java не дает результатов, даже при поиске по значению, о котором известно, что оно есть

#java #active-directory #ldap

Вопрос:

Я много искал в Google и видел несколько похожих ответов на этом сайте, но у меня ничего не работает.

Я пытался выполнить поиск ActiveDirectory с помощью LDAP. Поиск выполняется нормально, но он никогда не возвращает результатов. Я ищу по userPrincipalName, и этот пользователь абсолютно существует в ActiveDirectory.

 String securityPrincipal;
    securityPrincipal = "{0}@"  "ourcompany";
    securityPrincipal = MessageFormat.format(securityPrincipal, username);

    Hashtable<String,Object> env = new Hashtable<>();

    env.put(Context.PROVIDER_URL, "ldaps://OURCOMPANY:636");
    env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
    //Internal and external the same
    env.put(Context.SECURITY_AUTHENTICATION, "simple");
    env.put(Context.SECURITY_PRINCIPAL, securityPrincipal);
    env.put(Context.SECURITY_CREDENTIALS, password);
    env.put(Context.REFERRAL,"follow");

    boolean success;
    LdapContext ldapCtx = null;
    try {
        ldapCtx = new InitialLdapContext(env, null);
        success = true;
    } catch (NamingException ex) {
        ex.printStackTrace();
        success = false;
if(ldapCtx != null){
doSearch(ldapCtx)
}

private static final void doSearch(LdapContext ctx) throws NamingException{
        NamingEnumeration results = null;
        String domain = "DC=ourcompany,DC=com";
    String organizationalUnit = "ou=external";

    String searchUser;
    searchUser = "cdanvers@ourcompany.com";
    try {
        DirContext schema = ctx.getSchema("");

        String[] returning = {"userPrincipalName"};
        SearchControls ctrls = new SearchControls();
        ctrls.setSearchScope(SearchControls.SUBTREE_SCOPE);
        ctrls.setReturningAttributes(returning);
        Attributes attributes = new BasicAttributes(true);
        attributes.put("userPrincipalName",searchUser);

         results = ctx.search(organizationalUnit  ","  domain,attributes);

        while (results.hasMoreElements()){
            System.out.println("...");
        }


        System.out.println(results.hasMore());


    }catch (NamingException ex){
        ex.printStackTrace();
    } finally {
        results.close();
    }
 

В дополнение к тому, что указано выше, я пытался:

  • Использование этого типа поиска: results = ctx.search(organizationalUnit "," domain,"(amp; (userPrincipalName=" searchUser "))",ctrls);
  • Использование этого типа поиска: results = ctx.search(domain,"(amp; (userPrincipalName=" searchUser "))",ctrls);
  • Передача null в ctrls.setReturningAttributes()
  • ctrls.setSearchScope(SearchControls.OBJECT_SCOPE);

Это должно возвращать результаты. Значение Results не равно null, но results.entries() пусто.

Комментарии:

1. У вас есть надлежащие разрешения? Я бы посоветовал вам использовать известный хороший инструмент ldap, такой как ldapsearch или directory.apache.org/studio чтобы проверить ваш поиск

2. Я попробую это. Я думаю, что у меня есть надлежащие разрешения, но не уверен. Я подозревал, что некоторые из моих проблем связаны с разрешениями, но я не понял, как это точно выяснить.

3. Я загрузил Apache Directory Studio, как вы предложили. Это доказало свою ценность. Я не мог разобраться в своей проблеме, но, пытаясь, я понял, что не думаю, что мне это нужно. Я начал пытаться реализовать поиск для изучения LDAP, и моей реальной целью была запись в него данных. Не знаю, почему мне потребовалось так много времени, чтобы понять это. Мои разрешения в порядке. Проблема на самом деле не решена, но я думаю, что она перестала быть проблемой.