How do a LDAP search/authenticate against this LDAP in Java

前端 未结 3 367
一生所求
一生所求 2020-12-02 05:57

I am playing with LDAP and Java search. Here\'s my LDIF export with a simple organization

version: 1

dn: dc=example,dc=com
objectClass: organization
objectC         


        
相关标签:
3条回答
  • 2020-12-02 06:25

    You can also use the following code :

    package com.agileinfotech.bsviewer.ldap;
    
    import java.util.Hashtable;
    import java.util.ResourceBundle;
    
    import javax.naming.Context;
    import javax.naming.NamingException;
    import javax.naming.directory.DirContext;
    import javax.naming.directory.InitialDirContext;
    
    public class LDAPLoginAuthentication {
        public LDAPLoginAuthentication() {
            // TODO Auto-generated constructor
        }
    
        ResourceBundle resBundle = ResourceBundle.getBundle("settings");
    
        @SuppressWarnings("unchecked")
        public String authenticateUser(String username, String password) {
            String strUrl = "success";
            Hashtable env = new Hashtable(11);
            boolean b = false;
            String Securityprinciple = "cn=" + username + "," + resBundle.getString("UserSearch");
            env.put(Context.INITIAL_CONTEXT_FACTORY, resBundle.getString("InitialContextFactory"));
            env.put(Context.PROVIDER_URL, resBundle.getString("Provider_url"));
            env.put(Context.SECURITY_AUTHENTICATION, "simple");
            env.put(Context.SECURITY_PRINCIPAL, Securityprinciple);
            env.put(Context.SECURITY_CREDENTIALS, password);
    
            try {
                // Create initial context
                DirContext ctx = new InitialDirContext(env);
                // Close the context when we're done
                b = true;
                ctx.close();
    
            } catch (NamingException e) {
                b = false;
            } finally {
                if (b) {
                    strUrl = "success";
                } else {
                    strUrl = "failer";
                }
            }
            return strUrl;
        }
    }
    
    0 讨论(0)
  • 2020-12-02 06:29
    try {
        LdapContext ctx = new InitialLdapContext(env, null);
        ctx.setRequestControls(null);
        NamingEnumeration<?> namingEnum = ctx.search("ou=people,dc=example,dc=com", "(objectclass=user)", getSimpleSearchControls());
        while (namingEnum.hasMore ()) {
            SearchResult result = (SearchResult) namingEnum.next ();    
            Attributes attrs = result.getAttributes ();
            System.out.println(attrs.get("cn"));
    
        } 
        namingEnum.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
    
    private SearchControls getSimpleSearchControls() {
        SearchControls searchControls = new SearchControls();
        searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);
        searchControls.setTimeLimit(30000);
        //String[] attrIDs = {"objectGUID"};
        //searchControls.setReturningAttributes(attrIDs);
        return searchControls;
    }
    
    0 讨论(0)
  • 2020-12-02 06:38

    Another approach is using UnboundID. Its api is very readable and shorter

    Create a Ldap Connection

    public static LDAPConnection getConnection() throws LDAPException {
        // host, port, username and password
        return new LDAPConnection("com.example.local", 389, "Administrator@com.example.local", "admin");
    }
    

    Get filter result

    public static List<SearchResultEntry> getResults(LDAPConnection connection, String baseDN, String filter) throws LDAPSearchException {
        SearchResult searchResult;
    
        if (connection.isConnected()) {
            searchResult = connection.search(baseDN, SearchScope.ONE, filter);
    
            return searchResult.getSearchEntries();
        }
    
        return null;
    }
    

    Get all Oragnization Units and Containers

    String baseDN = "DC=com,DC=example,DC=local";
    String filter = "(&(|(objectClass=organizationalUnit)(objectClass=container)))";
    
    LDAPConnection connection = getConnection();        
    List<SearchResultEntry> results = getResults(connection, baseDN, filter);
    

    Get a specific Organization Unit

    String baseDN = "DC=com,DC=example,DC=local";
    String dn = "CN=Users,DC=com,DC=example,DC=local";
    
    String filterFormat = "(&(|(objectClass=organizationalUnit)(objectClass=container))(distinguishedName=%s))";
    String filter = String.format(filterFormat, dn);
    
    LDAPConnection connection =  getConnection();
    
    List<SearchResultEntry> results = getResults(connection, baseDN, filter);
    

    Get all users under an Organizational Unit

    String baseDN = "CN=Users,DC=com,DC=example,DC=local";
    String filter = "(&(objectClass=user)(!(objectCategory=computer)))";
    
    LDAPConnection connection =  getConnection();       
    List<SearchResultEntry> results = getResults(connection, baseDN, filter);
    

    Get a specific user under an Organization Unit

    String baseDN = "CN=Users,DC=com,DC=example,DC=local";
    String userDN = "CN=abc,CN=Users,DC=com,DC=example,DC=local";
    
    String filterFormat = "(&(objectClass=user)(distinguishedName=%s))";
    String filter = String.format(filterFormat, userDN);
    
    LDAPConnection connection =  getConnection();
    List<SearchResultEntry> results = getResults(connection, baseDN, filter);
    

    Display result

    for (SearchResultEntry e : results) {
        System.out.println("name: " + e.getAttributeValue("name"));
    }
    
    0 讨论(0)
提交回复
热议问题