如何使用Java

时间:2018-03-28 05:42:18

标签: java active-directory ldap

我们需要在基于Java的应用程序中从LDAP服务器获取动态组的所有用户。 下面是我的动态组网址:

ldap:///ou=testou,o=test.com??sub?(&(|(atype=*Abc Company*)(atype=*def Company*)(ctype=test))(enabled=1)(!(sgroup=*testgrp*))(!(|(op=ABC)(bdesc=*abcdef*))))

当我在JXplore中从上面的url提供过滤器时,我能够获得此动态组中可用的用户组,但是当我在下面的java代码中提供相同的过滤器时,LDAP不会返回任何结果。如果我提供了简单的过滤器,如cn = a *,那么它正在运行,LDAP正在返回结果。

public static void main(String[] args) throws NamingException, IOException {
     Properties env = new Properties();
     env.put("java.naming.factory.initial",
           "com.sun.jndi.ldap.LdapCtxFactory");
     // LDAP url
     env.put("java.naming.provider.url", "url");
     env.put("com.sun.jndi.ldap.read.timeout", "1000");
     // ldap login
     env.put("java.naming.security.principal", "username");
     env.put("java.naming.security.credentials", "password");
     InitialLdapContext ctx = new InitialLdapContext(env, null);
     String contextName = "ou=testou,o=test.com";
     // Filter expression
     String filterExpr = "(&(|(atype=*Abc Company*)(atype=*def Company*)(ctype=test))(enabled=1)(!(sgroup=*testgrp*))(!(|(op=ABC)(bdesc=*abcdef*))))"; // selects the groups a user belongs to.


     SearchControls constraints = new javax.naming.directory.SearchControls();
     constraints.setSearchScope(SearchControls.SUBTREE_SCOPE); // SUBTREE_SCOPE means recursive search
     ctx.setRequestControls(new Control[]{new PagedResultsControl(1000,true)});
     byte[] cookie = null;
     int totalResults = 0;


     NamingEnumeration<SearchResult> search = ctx.search(contextName,
           filterExpr,constraints);
     int count=0;
     while (search.hasMoreElements()) {
      count++;
        System.out.println(search.next().getName());    
    }
     System.out.println("Total user"+count);
}

1 个答案:

答案 0 :(得分:0)

假设你在谈论JNDI,遗憾的是JNDI Tutorial, p. 247,说:

  

注意:Sun的LDAP提供程序的1.2版不会正确处理查询组件

并且在Java 8的任何版本中似乎没有任何变化。

动态群组功能依赖于此。