You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Java Spring Boot连接本地部署Microsoft Active Directory的问题咨询

Spring Boot 连接 Microsoft Active Directory 实现身份验证方案及错误修复

基础连通方案

要实现Spring Boot和远程AD的连接验证,不需要依赖Microsoft Remote Desktop通道,直接通过LDAP协议访问AD服务端口即可实现,核心要求如下:

  • 确保你本地开发机器到AD服务器(100.36.224.125)的LDAP端口(默认389,LDAPS为636)网络可达,无防火墙拦截
  • 提前确认AD域的基础配置:根DN、用户所在组织单元、账号命名规则

NamingException 报错修复

你当前代码抛出异常的核心原因是配置参数和实际AD环境不匹配,按以下步骤修改即可:

  1. 修正LDAP路径匹配问题
    你当前代码中url参数配置的根DN为dc=springframework,dc=org,但后续搜索使用的base DN为ou=people,dc=example,dc=com,两个路径完全不匹配,导致上下文初始化后无法定位到搜索路径,直接抛出命名异常。
  2. 替换示例配置为实际AD参数
    你使用的登录账号后缀为myid.com.local,说明AD的根DN应为dc=myid,dc=com,dc=local,需将所有示例值(springframework.org、example.com)替换为你的实际AD配置。
  3. 可选配置调整
    如果AD域控制器禁用了简单认证,需要开启LDAPS协议,取消代码中SSL配置的注释,将端口改为636即可。
  4. 连通性预检
    先在本地执行telnet 100.36.224.125 389确认端口连通,端口不通的话先联系运维开放对应防火墙策略。

修正后参考代码

import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.Attribute;
import javax.naming.directory.Attributes;
import javax.naming.directory.InitialDirContext;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;
import java.util.Hashtable;

public class AdTest {
    public static void main(String[] args) {
        // 替换为你的实际AD账号
        String username = "test@myid.com.local";
        String password = "Yahoo@1234";
        // 根DN替换为实际AD域对应的DN:示例myid.com.local对应dc=myid,dc=com,dc=local
        String url = "ldap://100.36.224.125:389/dc=myid,dc=com,dc=local";
        // 搜索根路径替换为实际用户所在组织单元
        String base = "ou=people,dc=myid,dc=com,dc=local";

        Hashtable<String, Object> ldapParams = new Hashtable<>();
        ldapParams.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
        ldapParams.put(Context.PROVIDER_URL, url);
        ldapParams.put(Context.SECURITY_AUTHENTICATION, "simple");
        ldapParams.put(Context.SECURITY_PRINCIPAL, username);
        ldapParams.put(Context.SECURITY_CREDENTIALS, password);

        // 若使用LDAPS则取消下方注释,端口改为636
        //ldapParams.put(Context.SECURITY_PROTOCOL, "ssl");

        InitialDirContext ldapCtx = null;

        try {
            ldapCtx = new InitialDirContext(ldapParams);
            System.out.println("login success.");

            // 搜索过滤条件替换为实际要查询的用户cn
            String searchFilter = "(cn=itadmin)";

            SearchControls controls = new SearchControls();
            controls.setSearchScope(SearchControls.SUBTREE_SCOPE);
            NamingEnumeration<SearchResult> results = ldapCtx.search(base, searchFilter, controls);

            while (results.hasMore()) {
                SearchResult searchResult = results.next();
                Attributes attributes = searchResult.getAttributes();
                Attribute attr = attributes.get("cn");
                String cn = (String) attr.get();
                System.out.println(" Person Common Name = " + cn);
            }
        } catch (javax.naming.AuthenticationException ex) {
            System.out.println("login fail. [err 1] 账号密码错误");
            ex.printStackTrace();
        } catch (NamingException ex) {
            System.out.println("login fail. [err 2] 命名路径错误或AD不可达");
            ex.printStackTrace();
        } catch (Exception e) {
            System.out.println("login fail. [err 3] 未知错误");
            e.printStackTrace();
        } finally {
            if (ldapCtx != null) {
                try {
                    ldapCtx.close();
                } catch (NamingException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("LDAP Context 已释放");
        }
    }
}

内容的提问来源于stack exchange,提问作者Farhan Fida

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 19:36:02