首先,您将需要设置Active Directory,以便可以运行和测试代码。
如果(像我一样)没有一台装有Windows Server的计算机,那么即使在Mac OSX上,也可以通过这种方法设置Active Directory。
您要做的第一件事是在AD中设置用户a。 确保设置用户时,他不必在首次登录时更改密码,否则您将从Java代码中收到LDAP错误。
显然,您可以更改代码以提示更改密码,但这只是需要注意的事项。
还要为您的用户创建几个组,并将它们添加到他们的个人资料中。
在下面的代码中,只有一种验证方法。 它以用户,密码和域为参数,并返回用户所属的组的列表。 如果用户不存在或密码有问题,则会引发异常。
package util;import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.*;
import java.text.MessageFormat;
import java.util.*;public class ADConnect {private static final String MEMBER_OF = "memberOf";public static List<String> authenticate(String user,String securityToken,String domain) throws NamingException {Hashtable env = new Hashtable();env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");env.put(Context.PROVIDER_URL, "LDAP://" + domain);env.put(Context.SECURITY_AUTHENTICATION, "simple");env.put(Context.SECURITY_PRINCIPAL, user + "@" + domain);env.put(Context.SECURITY_CREDENTIALS, securityToken);InitialDirContext ctx = new InitialDirContext(env);String[] dcParts = domain.split("\\.");String domainSearch = "";for (String dcPart : dcParts) {domainSearch += "DC=" + dcPart + ",";}domainSearch = domainSearch.substring(0, domainSearch.length() - 1);// Create the search controlsSearchControls searchCtls = new SearchControls();String[] attributes = new String[]{MEMBER_OF};searchCtls.setReturningAttributes(attributes);// Specify the search scopesearchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);// Search for objects using the filterNamingEnumeration result = ctx.search(domainSearch,MessageFormat.format("(SAMAccountName={0})", user), searchCtls);//Get the first resultSearchResult sr = (SearchResult) result.next();Attribute memberOf = sr.getAttributes().get(MEMBER_OF);List<String> memberOfGroups = new ArrayList<>();if (memberOf != null) {for (Enumeration e1 = memberOf.getAll(); e1.hasMoreElements(); ) {memberOfGroups.add(e1.nextElement().toString());}}return memberOfGroups;}public static void main(String[] args) throws NamingException{System.out.println(ADConnect.authenticate("user", "password", "domain"));}
}
该代码很容易解释,您可以将其用作模板来尝试为搜索添加不同的属性。
翻译自: https://www.javacodegeeks.com/2015/06/integrating-active-directory-from-java.html