LDAP获取用户所属的组

时间:2017-05-30 08:58:26

标签: java spring spring-boot ldap

我是使用spring-boot(ldapTemplate)编写ldap的新手。我想获取用户所属的组,获取membreOf属性列表,我试过这个:

@Override
    public Person getUserInfo(String uid, String orgnisationUnit) throws InvalidNameException {
        Name dn = bindDn(uid, orgnisationUnit);
        return (Person ) ldapTemplate.lookup(dn, new LdapMapper());
    }

这是myLdapMapper:

public class LdapMapper implements ContextMapper<Object> {

    @Override
    public Object mapFromContext(Object ctx) {
        DirContextAdapter context = (DirContextAdapter) ctx;
        Person p = new Person();
        p.setFirstName(context.getStringAttribute("cn"));
        p.setMailAddress(context.getStringAttribute("uid"));
          p.setRoles(context.getObjectAttributes("memberOf"));  // roles was declared like:  private Object[] roles

        return p;
    }

}

你有什么建议吗?

2 个答案:

答案 0 :(得分:0)

我在另一个帖子中回答了这个问题:

https://stackoverflow.com/a/49869085/756076

答案 1 :(得分:-1)

import java.io.*;
import java.text.*;
import java.util.*;

import javax.naming.*;
import javax.naming.directory.*;
import javax.naming.ldap.InitialLdapContext;
import javax.xml.bind.*;

public class LdapConnection {

    public void getUserDetail(String user_name, String passwd) throws NamingException {
        DirContext ctx = null;
        String username = user_name;
        try {
            ctx = context(user_name, passwd);
            SearchControls searchCtls = new SearchControls();
            String returnedAtts[] = {"sn", "mail", "cn", "givenName",
                    "telephoneNumber", "manager","memberOf"};
            searchCtls.setReturningAttributes(returnedAtts);
            searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);
            String searchFilter = "(&(objectClass=user)(mail=*))";
            String searchBase = "OU=India,DC=<Domain Component>";
            NamingEnumeration<?> answer = ctx.search(searchBase, searchFilter,
                    searchCtls);
            while (answer.hasMoreElements()) {
                SearchResult sr = (SearchResult) answer.next();
                Attributes attrs = sr.getAttributes();
                if (attrs != null) {
                    try {
                        String cn = attrs.get("cn").get().toString();
                        String mail_id = attrs.get("mail").get().toString();
                        NamingEnumeration<?> memberOf = attrs.get("memberOf").getAll();
                        while (answer.hasMoreElements()) {
                            String member =(String)memberOf.next();
                            System.out.println("memberOf : " + member);
                        }
                    } catch (NullPointerException e) {
                        System.out.println(e.getMessage());
                    }
                }
            }
        } catch (NamingException e) {
            System.out.println(e.getMessage());
        } finally {
            if(!ctx.equals(null))
                ctx.close();       }
        }
    /**
     * This method will return Directory Context to the Called method,Used to
     * bind with LDAP
     */
    public DirContext context(String user, String passwd)
            throws NamingException {
        Hashtable<String, String> env = new Hashtable<String, String>();
        String adminName = "CN=" + user
                + ",OU=User,OU=India,DC=<Domain Component>";
        String adminPassword = passwd;
        String ldapURL = <ldapserver url with port>;
        env.put(Context.INITIAL_CONTEXT_FACTORY,
                "com.sun.jndi.ldap.LdapCtxFactory");
        env.put(Context.PROVIDER_URL, ldapURL);
        env.put(Context.SECURITY_AUTHENTICATION, "simple");
        env.put(Context.SECURITY_PRINCIPAL, adminName);
        env.put(Context.SECURITY_CREDENTIALS, adminPassword);
        DirContext ctx = new InitialLdapContext(env, null);
        return ctx;    }
    public static void main(String[] args) throws NamingException {
        LdapConnection ldap = new LdapConnection();
        ldap.getUserDetail("username","password");
    }
}`

我希望这段代码可以解决你的问题。