Во-первых, вам нужно настроить Active Directory, чтобы вы могли запускать и тестировать свой код.
Если (как и я) у вас нет машины с Windows Server, не беспокойтесь, это то , как вы можете настроить Active Directory даже на Mac OSX.
Первое, что вы хотите сделать, это настроить пользователя в AD. Убедитесь, что при настройке пользователя ему не нужно менять свой пароль при первом входе в систему, иначе вы получите ошибку LDAP из вашего кода Java.

Ясно, что вы можете изменить свой код, чтобы запросить изменение пароля, но просто о чем-то, что нужно знать
Также создайте пару групп для своего пользователя и добавьте их в свой профиль.
В приведенном ниже коде есть только один метод аутентификации. Он принимает в качестве параметров пользователя, пароль и домен и возвращает список групп, членом которых является пользователь. Если пользователь не существует или существует проблема с паролем, выдается исключение.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
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 controls SearchControls searchCtls = new SearchControls(); String[] attributes = new String[]{MEMBER_OF}; searchCtls.setReturningAttributes(attributes); // Specify the search scope searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE); // Search for objects using the filter NamingEnumeration result = ctx.search(domainSearch, MessageFormat.format("(SAMAccountName={0})", user), searchCtls); //Get the first result SearchResult 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")); }} |
Код достаточно понятен, и вы можете использовать его в качестве шаблона для экспериментов с добавлением различных атрибутов в поиск.
| Ссылка: | Интеграция Active Directory из Java от нашего партнера по JCG Даниэля Шая в блоге Rational Java . |