Java读取AD的user和group实现流程

概述

在Java中,我们可以使用LDAP(轻量级目录访问协议)来读取Active Directory(AD)中的用户和组信息。LDAP是一种用于访问和维护分布式目录信息的协议。通过LDAP,我们可以连接AD服务器,并执行查询操作来获取用户和组的信息。

下面将详细介绍实现这个功能的步骤。首先,我们先来看一下整个流程的步骤。

流程步骤表格

步骤 描述
1 创建LDAP连接
2 绑定LDAP连接
3 执行查询操作
4 解析查询结果
5 关闭LDAP连接

代码实现

步骤1:创建LDAP连接

import javax.naming.Context;
import javax.naming.NamingException;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;
import java.util.Hashtable;

public class LDAPUtils {
    private static DirContext createContext() throws NamingException {
        Hashtable<String, String> env = new Hashtable<>();
        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
        env.put(Context.PROVIDER_URL, "ldap://ad_server_ip:ad_server_port");
        env.put(Context.SECURITY_AUTHENTICATION, "simple");
        env.put(Context.SECURITY_PRINCIPAL, "username");
        env.put(Context.SECURITY_CREDENTIALS, "password");
        return new InitialDirContext(env);
    }
}
  • Context.INITIAL_CONTEXT_FACTORY:设置LDAP上下文工厂类。
  • Context.PROVIDER_URL:设置AD服务器的URL(格式为ldap://ad_server_ip:ad_server_port)。
  • Context.SECURITY_AUTHENTICATION:设置认证方式,一般为"simple"。
  • Context.SECURITY_PRINCIPAL:设置用于认证的用户名。
  • Context.SECURITY_CREDENTIALS:设置用于认证的密码。

步骤2:绑定LDAP连接

public class LDAPUtils {
    // ...

    private static DirContext createContext() throws NamingException {
        // ...
        return new InitialDirContext(env);
    }

    private static DirContext bindContext() throws NamingException {
        DirContext context = createContext();
        context.reconnect(null);
        return context;
    }
}
  • context.reconnect(null):重新连接到LDAP服务器,使用之前设置的用户名和密码进行认证。

步骤3:执行查询操作

import javax.naming.NamingEnumeration;
import javax.naming.directory.Attributes;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;
import java.util.ArrayList;
import java.util.List;

public class LDAPUtils {
    // ...

    public static List<String> searchUsers(String baseDN, String filter) throws NamingException {
        DirContext context = bindContext();
        SearchControls controls = new SearchControls();
        controls.setSearchScope(SearchControls.SUBTREE_SCOPE);
        NamingEnumeration<SearchResult> results = context.search(baseDN, filter, controls);

        List<String> users = new ArrayList<>();
        while (results.hasMore()) {
            SearchResult searchResult = results.next();
            Attributes attributes = searchResult.getAttributes();
            String username = attributes.get("sAMAccountName").get().toString();
            users.add(username);
        }

        return users;
    }
}
  • baseDN:搜索的起始位置,一般为AD域的根节点。
  • filter:查询条件,可以根据需要设置过滤条件。
  • SearchControls:定义搜索控制选项,我们这里将搜索范围设置为SUBTREE_SCOPE,表示搜索整个子树。
  • SearchResult:表示查询结果的对象,通过它可以获取到用户的属性信息。

步骤4:解析查询结果

import javax.naming.directory.Attributes;

public class LDAPUtils {
    // ...

    public static List<String> searchUsers(String baseDN, String filter) throws NamingException {
        // ...

        List<String> users = new ArrayList<>();
        while (results.hasMore()) {
            SearchResult searchResult = results.next();
            Attributes attributes = searchResult.getAttributes();
            String username = attributes.get("sAMAccountName").get().toString();
            users.add(username);
        }

        return users;
    }
}
  • Attributes:表示用户的属性信息,我们可以通过它来获取到具体的属性值。

步骤5:关闭LDAP连接

import javax.naming.NamingException;
import javax.naming.directory.DirContext;

public class LDAPUtils {
    // ...

    public static void closeContext(Dir