Статьи

Интеграция Active Directory из Java

Во-первых, вам нужно настроить Active Directory, чтобы вы могли запускать и тестировать свой код.

Если (как и я) у вас нет машины с Windows Server, не беспокойтесь, это то , как вы можете настроить Active Directory даже на Mac OSX.

Первое, что вы хотите сделать, это настроить пользователя в AD. Убедитесь, что при настройке пользователя ему не нужно менять свой пароль при первом входе в систему, иначе вы получите ошибку LDAP из вашего кода Java.

Снимок экрана 2015-06-12 в 15.17.16
Ясно, что вы можете изменить свой код, чтобы запросить изменение пароля, но просто о чем-то, что нужно знать

Также создайте пару групп для своего пользователя и добавьте их в свой профиль.

В приведенном ниже коде есть только один метод аутентификации. Он принимает в качестве параметров пользователя, пароль и домен и возвращает список групп, членом которых является пользователь. Если пользователь не существует или существует проблема с паролем, выдается исключение.

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 .