使用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环境不匹配,按以下步骤修改即可:
- 修正LDAP路径匹配问题
你当前代码中url参数配置的根DN为dc=springframework,dc=org,但后续搜索使用的base DN为ou=people,dc=example,dc=com,两个路径完全不匹配,导致上下文初始化后无法定位到搜索路径,直接抛出命名异常。 - 替换示例配置为实际AD参数
你使用的登录账号后缀为myid.com.local,说明AD的根DN应为dc=myid,dc=com,dc=local,需将所有示例值(springframework.org、example.com)替换为你的实际AD配置。 - 可选配置调整
如果AD域控制器禁用了简单认证,需要开启LDAPS协议,取消代码中SSL配置的注释,将端口改为636即可。 - 连通性预检
先在本地执行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
相关产品推荐
相关产品推荐

